我在Silverlight UserControl中有以下DependencyProperty:
public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register( "Columns", typeof( ObservableCollection<FilterableDataGridColumn> ), typeof( FilterableDataGridControl ), new PropertyMetadata( new ObservableCollection<FilterableDataGridColumn>(), new PropertyChangedCallback( OnColumnsChanged ) ) );
public ObservableCollection<FilterableDataGridColumn> Columns {
get {
return ( ObservableCollection<FilterableDataGridColumn> )GetValue( ColumnsProperty );
}
set {
SetValue( ColumnsProperty, value );
}
}
static void OnColumnsChanged( object sender, DependencyPropertyChangedEventArgs args ) {
...
}
我正在尝试从xaml初始化它:
<my:FilterableDataGridControl ... >
<my:FilterableDataGridControl.Columns>
<my:FilterableDataGridColumn Header="Name" PropertyName="Name" ColumnType="Text" />
<my:FilterableDataGridColumn Header="Type" PropertyName="Type" ColumnType="Text" />
</my:FilterableDataGridControl.Columns>
</my:FilterableDataGridControl>
但它不起作用!没有异常,没有错误,但是没有调用OnColumnsChanged。
有什么想法吗?
答案 0 :(得分:1)
我完整地模拟了你的例子,基本上你期望ObservableCollection的内容更改发生属性更改事件。只有在替换集合本身时才会触发事件处理程序,而您只替换子元素而不是集合。
您的代码中唯一会受到影响的是getter:
get { return (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty); }
可能有一种更优雅的方式将事件连接到动态创建的属性,但这将起作用:
public ObservableCollection<FilterableDataGridColumn> Columns
{
get
{
var columns = (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty);
columns.CollectionChanged -= columns_CollectionChanged; // Disconnect each time we reconnect
columns.CollectionChanged += columns_CollectionChanged;
return columns;
}
set
{
var columns = (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty);
if (columns != null)
{
columns.CollectionChanged -= columns_CollectionChanged; // Disconnect each time we change collection
}
SetValue(ColumnsProperty, value);
}
}
void columns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// This will get hit
}
这是向集合添加CollectionChanged
处理程序,而不是监听要替换的集合本身。
* 你会注意到setter会遇到从以前的任何集合中移除hander的麻烦。这是“以防万一”的衡量标准,否则与此属性断开连接的集合仍会在删除后报告更改。这不是必需的,以使其适用于您的属性添加的初始集合