Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何判断自定义控件的ItemsSource何时更改_Wpf_Vb.net_Custom Controls_Itemscontrol_Itemssource - Fatal编程技术网

Wpf 如何判断自定义控件的ItemsSource何时更改

Wpf 如何判断自定义控件的ItemsSource何时更改,wpf,vb.net,custom-controls,itemscontrol,itemssource,Wpf,Vb.net,Custom Controls,Itemscontrol,Itemssource,在开发的早期阶段,我有一个自定义控件,因为我努力学习wpf自定义控件的开发。自定义控件继承自ItemsControl,该控件允许我访问要绑定可枚举集合的ItemsSource属性 目前,我有一个简单的两个项目解决方案,其中一个包含我的自定义控件,另一个包含一个测试项目,用于测试前者。在我的测试项目中,我有一个简单的主窗口,我将自定义控件放在该窗口上,并将其ItemsSource绑定 <WpfControls:VtlDataNavigator x:Name="MyDataNaviga

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

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

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

在主窗口(实现INotifyPropertyChanged)的loaded事件中,我实例化Orders集合。customcontrols在主窗口加载之前进行初始化,但我可以通过检查Visual studio中的Live Visual树看到,一旦主窗体加载,custom controls Items源属性实际上设置为Orders。现在,我当然想计算订单数,并让我的自定义控件显示它(这是一个简单的数据导航器,所以我要的是记录数)。我知道如何获取计数,但我如何知道itemsSource何时发生了更改,以便我可以对此作出反应并获取计数。我看不到任何itemsSourceChanged事件


我看过一篇博客文章,但我想知道是否有更直接的方法来实现这一点,因为这似乎是一件显而易见的事情。

ItemsSource是一个DependencyProperty,在创建DPs时,您可以选择指定“property changed”事件。不幸的是,ItemsSource被锁定在基类中,所以我开始怀疑是否有办法将您自己的事件添加到现有DP中。我发现这看起来很有希望。基本上你会这样做(未经测试,所以请阅读本文!):-


您可以使用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!");
    }
}

Andrew,谢谢你的意见,我会仔细阅读这篇文章,看看有什么好处。与此同时,我发现下面的内容至少给了我一些可以玩的东西。当我从ItemsControl继承时,似乎可以利用它的Items属性,该属性恰好公开了CurrentChanged事件,因此我当前在控件AddHandler MyBase.Items.CurrentChanged的构造函数中有以下内容。它似乎有效,是否正确是另一回事。非常好的解决方案,当然比我临时想出的更优雅。谢谢,当然可以!此外,如果希望为控件的使用者支持事件处理程序,可以添加事件处理程序。
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!");
    }
}