【问题标题】:WPF .NET Core - how to find source of dependency property changed event?WPF .NET Core - 如何找到依赖属性更改事件的来源?
【发布时间】: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 你是完全正确的。我对这个问题投了反对票以表达我的不满。
  • 如果没有看到上下文并不意味着它不存在
  • 让我们忘记它。下次我们会相处得更好。

标签: c# wpf .net-core


【解决方案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”。这不是唯一的方法。
猜你喜欢
  • 2016-10-06
  • 2018-05-20
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多