WPF .NET Core — как найти источник события изменения свойства зависимости?

#c# #wpf #.net-core

Вопрос:

Мне нужно запустить код при ListViewItem наведении курсора мыши на событие. Я попробовал несколько решений, но ни одно из них не сработало для меня.

Я придумал это:

 private void ProcessListItems()  {  foreach (var item in settings.items)  {  var i = lst.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem;  if (i == null)  continue;   BindingOperations.SetBinding(this, ItemMouseOverProperty, new Binding  {  Path = new PropertyPath(ListViewItem.IsMouseOverProperty),  Source = i   });  }  }   public bool ItemMouseOver  {  get { return (bool)GetValue(ItemMouseOverProperty); }  set { SetValue(ItemMouseOverProperty, value); }  }   public static readonly DependencyProperty ItemMouseOverProperty =  DependencyProperty.Register("ItemMouseOver", typeof(bool), typeof(MainWindow), new PropertyMetadata(false, OnItemMouseOverChanged));   static void OnItemMouseOverChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  {  }  

Как только все элементы будут добавлены в представление списка, я привязываю каждый элемент ItemMouseOverProperty к своему собственному реквизиту dep ItemMouseOverProperty .

Теперь мне нужно найти, что ListViewItem его спровоцировало..

Короче говоря: я привязываю одно свойство dep к другому. Я хочу выяснить, какой source объект вызвал changed событие.

Комментарии:

1. Это плохой вопрос. Контекст абсолютно неясен. Пожалуйста, прекратите публиковать несвязанные фрагменты кода или фрагменты без контекста. Они совершенно бессмысленны для людей, которые не знают вашего проекта. Это очень плохая и очень раздражающая привычка здесь. Как мы можем узнать контекст, в котором вам нужно решение? Решение чаще всего зависит от таких деталей.

2. @BionicCode, почему ты тогда отвечаешь? Проголосуйте за закрытие и продолжайте.

3. @Клеменс, Ты абсолютно прав. Я опустил вопрос, чтобы выразить свое недовольство.

4. если вы не видите контекста, это не значит, что его там нет

5. Давай забудем об этом. В следующий раз мы поладим лучше.

Ответ №1:

Контекст вашего кода неясен. Вы расширяете ListView или это скрытый код?

Как правило, вы можете прикрепить обработчики событий к ListViewItem.MouseEnter событию, добавив EventSetter в стиль:

 lt;ListViewgt;  lt;ListView.ItemContainerStylegt;  lt;Style TargetType="ListViewItem"gt;  lt;EventSetter Event="MouseEnter" Handler="ListViewItem_MouseEnter" /gt;  lt;/Stylegt;  lt;/ListView.ItemContainerStylegt; lt;/ListViewgt;  private void ListViewItem_MouseEnter(object sender, MouseEventArgs e) {  var mouseOverItem = sender as ListViewItem; }  

В зависимости от вашего конкретного контекста вы также можете определить триггеры и включить ListBoxItem.IsMouseOver их .

Комментарии:

1. спасибо вам за ответ. re: контекст — это не имеет значения. Я привязываю одно свойство dep к другому. Я хочу выяснить, какой исходный объект вызвал changed событие. что в этом непонятного?

2. «вы также можете активировать функцию ListBoxItem. IsMouseOver» — единственный известный мне способ-использовать EventTrigger, и они не предназначены для выполнения кода только определенных действий XAML. Я попробовал привязку команд и потерпел неудачу.

3. «что в этом непонятного?» Я сказал вам, что непонятно. То, что вы делаете, невозможно — совершенно неправильный подход. И для того, чтобы предоставить вам правильное решение, человеку нужно больше контекста. С вашей стороны довольно смело называть просьбу человека, к которому вы обратились за помощью, неуместной. Я жаловался не только для того, чтобы жаловаться. Я хотел помочь и понял, что для того, чтобы предоставить вам лучшее решение, не хватает какой-то важной информации. Такое чувство, что вы очень высокомерно подходите ко мне, говоря, что мой запрос о предоставлении информации не имеет значения. Это высокомерно или невежественно.

4. «единственный известный мне способ-использовать EventTrigger» . Это не единственный способ.