如何判断Custom控件的ItemsSource何时更改

时间:2015-11-12 14:42:53

标签: wpf vb.net custom-controls itemscontrol itemssource

我在开发的早期阶段有一个自定义控件,因为我努力学习wpf自定义控件开发。自定义控件继承自ItemsControls,这使我可以访问我绑定可枚举集合的ItemsSource属性。

目前我有一个简单的两个项目解决方案,包括我的自定义控件和另一个测试项目,以测试前者。在我的测试项目中,我有一个简单的主窗口,我将自定义控件放在其上并绑定其ItemsSource。

    <WpfControls:VtlDataNavigator x:Name="MyDataNavigator"
                                      ItemsSource="{Binding ElementName=MainWindow, Path=Orders}" />

在主窗口的加载事件中(实现INotifyPropertyChanged),我实例化了Orders集合。自定义控件在主窗口加载之前初始化,但是我可以通过检查visual studio中的Live Visual Tree看到,一旦主窗体加载自定义控件,Item Source属性确实设置为Orders。当然,我当然喜欢计算订单并让我的自定义控件显示(它是一个简单的数据导航器,因此我记录的是记录计数)。我知道如何计算,但我怎么知道itemsSource何时发生变化,以便我能对它做出反应并获得计数。我可以看到没有itemsSourceChanged事件。

我已经看过this博客文章,但我想知道是否有一种更为直接的方法,因为它似乎是一个显而易见的想要了解的事情。

2 个答案:

答案 0 :(得分:1)

您可以使用OverrideMetaData执行此操作。

试试这个:

public class Class1 : ItemsControl
{
    static Class1()
    {
        ItemsSourceProperty.OverrideMetadata(typeof(Class1), 
        new FrameworkPropertyMetadata(null, OnItemSourceChanged));
    }

    private static void OnItemSourceChanged(DependencyObject d, 
                                            DependencyPropertyChangedEventArgs e)
    {
        Debug.WriteLine("Why you haz Changed me!");
    }
}

答案 1 :(得分:0)

ItemsSource是DependencyProperty,在创建DP时,您可以选择指定&#34;属性已更改&#34;事件。不幸的是,ItemsSource被锁定在基类中,所以我开始想知道是否有办法将自己的事件添加到现有的DP中。我遇到了看起来很有希望的this article。基本上你会做这样的事情(未经测试,所以阅读文章!): -

var dpd = DependencyPropertyDescriptor.FromProperty(
    VtlDataNavigator.ItemsSourceProperty, 
    typeof(VtlDataNavigator));

if (dpd != null)
{
    dpd.AddValueChanged(
        vtlDataNavigatorInstance, 
        delegate
          {
              var count = VtlDataNavigatorInstance.ItemsSource.Count; // Or whatever...
          });
}