我在开发的早期阶段有一个自定义控件,因为我努力学习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博客文章,但我想知道是否有一种更为直接的方法,因为它似乎是一个显而易见的想要了解的事情。
答案 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...
});
}