Связывание / связывание событий с кнопкой в ​​ItemsControl, вложенном в ItemControls DataTemplate - PullRequest
3 голосов
/ 27 октября 2011

Мой вопрос очень похож на это: ( Связывание событий с кнопками в ItemsControl ), но я не нашел там решения.У меня есть ItemsControl и внутри его DataTemplate, у меня есть другой ItemsControl.Элементы во внешнем элементе управления содержат классы, которые имеют некоторые свойства, и одно из свойств является коллекцией.Внутренний источник ItemsControl связан с этой коллекцией, а внутри внутреннего элемента управления DataTemplate есть кнопка.

Моя проблема заключается в том, что когда я подключаю событие для кнопки (.. Click = "dummyfunc") ипри попытке запустить проект я получаю необработанное исключение XamlParseException (4004) и говорит, что «не удалось присвоить свойству System.Windows.Controls.Primitives.ButtonBase.Click» я объявил свой обработчик событий в CodeBehind страницы, на которойвнешний ItemsControl находится в Xaml.И это прекрасно работает для кнопок, размещенных во внешних элементах управления DataTemplate.Но в шаблоне внутренних элементов управления я просто не могу подключить какие-либо события.

Одно работает:

<HyperlinkButton  Content="x">
     <i:Interaction.Triggers>
         <i:EventTrigger EventName="Click">
             <ei:CallMethodAction MethodName="DeleteMe" TargetObject="{Binding}"/>                            
         </i:EventTrigger>
     </i:Interaction.Triggers>             
</HyperlinkButton>

Но это вызывает только метод (DeleteMe), который реализован в элементе Iупомянутое выше, имеет некоторые свойства и коллекцию.

Но вместо этого мне нужно обработать события во внутреннем элементе управления обычным методом:

public void dummyfunc(object sender, RoutedEventArgs e){...}

(так что я могуполучить кнопку, которая запустила событие, например:

sender as HyperinkButton 

или

e.OriginalSource as HyperlinkButton

Я полагаю, проблема в том, что событие не всплыло, и я получаю исключение синтаксического анализа, потому что анализаторне могу найти объявление обработчика события в фактической области видимости, которая, очевидно, не является CodeBehind для внутреннего контроля: (

Причина, по которой мне это нужно, заключается в том, что я хотел бы сделать некоторую пользовательскую логику пользовательского интерфейса в коде, ивызывать логику DeleteMe как-то только после этого.

Спасибо, Балинт

1 Ответ

3 голосов
/ 27 октября 2011

Это не очевидно из спартанской документации для CallMethodAction, но метод, названный свойством MethodName, может иметь одну из следующих сигнатур:

  • void Method()
  • void Method(object associatedObject, object parameter)

Кроме того, по умолчанию parameter для действия EventTrigger является значением аргументов события, которое обычно передается в качестве второго аргумента в обработчик события.Для события Click тип параметра - RoutedEventArgs, поэтому вы можете определить свой метод DeleteMe следующим образом:

public void DeleteMe(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("sender: {0}", sender);
    Debug.WriteLine("e.OriginalSource: {0}", e.OriginalSource);
}

Это дает вам доступ ко всей информации, которая вам нужна при обработкеClick событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...