Дважды щелкните по объекту ListBox для открытия браузера

Проблема

Я предполагаю, что обработчик событий вызывает метод trackId. Если мы вызываем метод из обработчика события, метод больше не имеет привязки this к экземпляру класса. Поскольку this больше не привязан к экземпляру класса, метод cargarElementosFoda не определен, что и является вашей ошибкой.

Одно решение

Сделайте trackId в функцией стрелки вместо метода. Это обеспечит привязку this к экземпляру класса, даже когда функция стрелки вызывается из события.

trackId = (index: number, item: IDiagnosticoFoda) => {
    console.log('el id de este diagnostico foda es' + item.id);
    this.cargarElementosFoda(item.id); 
}

Подробнее

Вот упрощенный пример с одним событием, которое вызывает функцию стрелки, и другим событием, которое вызывает метод. Обратите внимание, что метод имеет this привязанный к классу, только когда он вызывается из экземпляра этого класса.

class Foo {

  someMethod() {
    console.log('someMethod:' + (this instanceof Foo));
  }

  someArrowFunction = () => {
    console.log('someArrowFunction:' + (this instanceof Foo));
  };
}

const foo = new Foo();

// when called from an instance of the class,
// both the arrow function and the method are bound to an instance of Foo
foo.someArrowFunction();
foo.someMethod();

// when not called from an event
// the arrow function remains bound to the instance of Foo
document
  .getElementById('btn1')
  .addEventListener("click", foo.someArrowFunction);

// when not called from an event
// the  method is no longer bound the instance of Foo
document
  .getElementById('btn2')
  .addEventListener("click", foo.someMethod);

41
задан Dave Clemmer 29 July 2011 в 20:29
поделиться

2 ответа

Вы можете добавить стиль в ListBox.ItemContainerStyle и добавить туда EventSetter :

<ListBox>
    ....
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
            <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

ListBoxItem_MouseDoubleClick - это метод в вашем коде с правильная подпись для MouseDoubleClick .

82
ответ дан 27 November 2019 в 00:20
поделиться

Я хотел решить эту проблему без необходимости обрабатывать событие двойного щелчка listBoxItem в коде программной части, и я не хотел переопределять стиль listBoxItem (или определять стиль для переопределения в первую очередь). Я хотел просто запустить команду при двойном щелчке по listBox.

Я создал прикрепленное свойство вроде этого (код очень конкретен, но вы можете обобщить его по мере необходимости):

public class ControlItemDoubleClick : DependencyObject {
public ControlItemDoubleClick()
{

}

public static readonly DependencyProperty ItemsDoubleClickProperty =
    DependencyProperty.RegisterAttached("ItemsDoubleClick",
    typeof(bool), typeof(Binding));

public static void SetItemsDoubleClick(ItemsControl element, bool value)
{
    element.SetValue(ItemsDoubleClickProperty, value);

    if (value)
    {
        element.PreviewMouseDoubleClick += new MouseButtonEventHandler(element_PreviewMouseDoubleClick);
    }
}

static void element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ItemsControl control = sender as ItemsControl;

    foreach (InputBinding b in control.InputBindings)
    {
        if (!(b is MouseBinding))
        {
            continue;
        }

        if (b.Gesture != null
            && b.Gesture is MouseGesture
            && ((MouseGesture)b.Gesture).MouseAction == MouseAction.LeftDoubleClick
            && b.Command.CanExecute(null))
        {
            b.Command.Execute(null);
            e.Handled = true;
        }
    }
}

public static bool GetItemsDoubleClick(ItemsControl element)
{
    return (bool)element.GetValue(ItemsDoubleClickProperty);
}

}

Затем я объявляю свое ListBox с прикрепленным свойством и моей целевой командой:

<ListBox ItemsSource="{Binding SomeItems}"
     myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
    <MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>

Надеюсь, это поможет.

10
ответ дан 27 November 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: