#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» . Это не единственный способ.