所以我刚刚实现了我的第一个usercontrol。它包含一个ComboBox,我想填充复选框。它会在数据网格的标题中重复出现。
组合框的ItemsSource通过我的usercontrol中的DependencyProperty公开。当我声明这个DependecyProperty时,我也传递一个回调,因为我想在将它传递给组合框之前准备它。这是在回调中完成的。
一切正常,绑定似乎有效,除了它们在底层集合发生变化时不会更新。我的底层集合是一个ObservableCollection,我的回调仅在声明集合时被调用(尽管我在添加项目后立即对属性进行了propertychanged调用)。
这是我的usercontrol代码:
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource",typeof(ObservableCollection<RoomViewModel>),typeof(DataGridFilterControl),new PropertyMetadata(new PropertyChangedCallback(ItemsSourceChangedCallBack)));
static private void ItemsSourceChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGridFilterControl originator = d as DataGridFilterControl;
if (originator != null)
{
originator.PopulateCheckBoxes();
}
}
public ObservableCollection<RoomViewModel> ItemsSource
{
get
{
return (ObservableCollection<RoomViewModel>)GetValue(ItemsSourceProperty);
}
set
{
SetValue(ItemsSourceProperty,value);
}
}
ComboBox的xaml:
<ComboBox ItemsSource="{Binding Path=CheckBoxView}" />
正如您所看到的,ComboBox的ItemsSource与DependecyProperty不同。这是故意的。但是这不应该影响我的回调,对吗?
我将项目从另一个线程添加到集合中,因此使用Invoke方法在Dispatcher中进行(如果这有任何区别)。
如果在更改属性或调用propertychanged时,如何调用Callback?