WPF .NET Core - 如何找到依赖属性更改事件的来源?

Posted

技术标签:

【中文标题】WPF .NET Core - 如何找到依赖属性更改事件的来源?【英文标题】:WPF .NET Core - how to find source of dependency property changed event? 【发布时间】:2021-12-05 00:30:08 【问题描述】:

我需要在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 prop ItemMouseOverProperty

现在我需要找出是哪个ListViewItem 触发了它..

简而言之:我将一个 dep 属性绑定到另一个。我想知道是哪个source 对象引发了changed 事件。

【问题讨论】:

这是一个糟糕的问题。上下文绝对不清楚。请停止在没有上下文的情况下发布不相关的代码 sn-ps 或 sn-ps。对于不了解您的项目的人来说,它们完全没有意义。这是一个非常糟糕和非常烦人的习惯。我们如何知道您需要解决方案的环境?解决方案通常取决于这些细节。 @BionicCode 那你为什么要回答呢?投票结束并继续。 @Clemens 你是完全正确的。我对这个问题投了反对票以表达我的不满。 如果没有看到上下文并不意味着它不存在 让我们忘记它。下次我们会相处得更好。 【参考方案1】:

您的代码上下文不清楚。你是在扩展 ListView 还是这个代码隐藏?

通常,您可以通过在样式中添加EventSetter 来将事件处理程序附加到ListViewItem.MouseEnter 事件:

<ListView>
  <ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
      <EventSetter Event="MouseEnter" Handler="ListViewItem_MouseEnter" />
    </Style>
  </ListView.ItemContainerStyle>
</ListView>

private void ListViewItem_MouseEnter(object sender, MouseEventArgs e)

   var mouseOverItem = sender as ListViewItem;

根据您的确切上下文,您还可以定义触发器并在ListBoxItem.IsMouseOver 上触发。

【讨论】:

感谢您的回答。回复:上下文 - 这无关紧要。我将一个 dep 属性绑定到另一个。我想找出哪个 source 对象引发了changed 事件。有什么不清楚的地方? “您也可以在 ListBoxItem.IsMouseOver 上触发” - 我知道的唯一方法是使用 EventTrigger,它们并非旨在仅运行某些 XAML 操作的代码。我尝试了命令绑定,但失败了。 “有什么不清楚的地方吗?” 我告诉你有什么不清楚的地方。你正在做的事情是不可能的——完全错误的方法。为了给你提供合适的解决方案,人需要更多的上下文。你把你寻求帮助的人的请求说成无关紧要,真是太大胆了。我不是为了抱怨而抱怨。我想提供帮助并意识到为了为您提供最佳解决方案,缺少一些关键信息。感觉就像你非常傲慢地接近我,告诉我我的信息请求无关紧要。这是傲慢还是无知。 “我知道的唯一方法是使用 EventTrigger”。这不是唯一的方法。

以上是关于WPF .NET Core - 如何找到依赖属性更改事件的来源?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?

在 WPF .net core 5 中运行时更改应用程序文化时如何更新属性绑定

WPF .Net Core 3.1 依赖注入/服务参考问题

.Net core 3:手动添加框架依赖

如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?

WPF依赖属性1