Я предполагаю, что обработчик событий вызывает метод 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);
Вы можете добавить стиль в 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 .
Я хотел решить эту проблему без необходимости обрабатывать событие двойного щелчка 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>
Надеюсь, это поможет.