ObservableCollection <t>从xaml初始化 - Silverlight </t>

时间:2011-07-11 09:20:10

标签: silverlight user-controls observablecollection

我在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。

有什么想法吗?

1 个答案:

答案 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的麻烦。这是“以防万一”的衡量标准,否则与此属性断开连接的集合仍会在删除后报告更改。这不是必需的,以使其适用于您的属性添加的初始集合