集合依赖属性

我有一个自定义控件,它具有ObservableCollection类型的DependencyProperty ,它绑定到observableCollection

 <MyControl MyCollectionProperty = {Binding MyObservableCollection} ... 

问题是添加到MyObservableCollection不会更新MyCollectionProperty

我需要完全替换MyObservableCollection以使其工作,例如

 MyObservableCollection = null; MyObservableCollection = new ObservableCollection(){...} 

有没有更好的方法来处理这个?

编辑:

  public ObservableCollection Columns { get { return (ObservableCollection)GetValue(ColumnsProperty); } set { SetValue(ColumnsProperty, value); } } public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register("Columns", typeof(ObservableCollection), typeof(MyControl), new PropertyMetadata(new ObservableCollection(), OnChanged)); 

以下是一个可能有用的工作示例。

在此示例中,立即调用OnChanged方法,单击“添加”按钮时,“已更改”将写入控制台。

控制

 public class MyControl : Control { public ObservableCollection ExtraColumns { get { return (ObservableCollection)GetValue(ExtraColumnsProperty); } set { SetValue(ExtraColumnsProperty, value); } } public static readonly DependencyProperty ExtraColumnsProperty = DependencyProperty.Register("ExtraColumns", typeof(ObservableCollection), typeof(MyControl), new PropertyMetadata(new ObservableCollection(), OnChanged)); static void OnChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { (sender as MyControl).OnChanged(); } void OnChanged() { if ( ExtraColumns != null ) ExtraColumns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ExtraColumns_CollectionChanged); } void ExtraColumns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { Console.WriteLine("Changed"); } } 

窗户

       

窗口代码背后

 public partial class MainWindow : Window { private ObservableCollection _extras = new ObservableCollection( ); public ObservableCollection Extras { get { return _extras; } set { if (value != _extras) { _extras = value; } } } public MainWindow() { InitializeComponent(); DataContext = this; } private void Button_Click(object sender, RoutedEventArgs e) { Extras.Add("Additional"); } } 

除了grantz已经回答的内容之外,我建议使用IEnumerable类型声明属性,并在运行时检查集合对象是否实现了INotifyCollectionChanged接口。 这为可以将哪个具体集合实现用作属性值提供了更大的灵活性。 然后,用户可以决定具有他们自己的可观察集合的专用实现。

另请注意,在ColumnsPropertyChanged回调中, CollectionChanged事件处理程序附加到新集合,但也从旧集合中删除。

 public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register( "Columns", typeof(IEnumerable), typeof(MyControl), new PropertyMetadata(null, ColumnsPropertyChanged)); public IEnumerable Columns { get { return (IEnumerable)GetValue(ColumnsProperty); } set { SetValue(ColumnsProperty, value); } } private static void ColumnsPropertyChanged( DependencyObject obj, DependencyPropertyChangedEventArgs e) { var control= (MyControl)obj; var oldCollection = e.OldValue as INotifyCollectionChanged; var newCollection = e.NewValue as INotifyCollectionChanged; if (oldCollection != null) { oldCollection.CollectionChanged -= control.ColumnsCollectionChanged; } if (newCollection != null) { newCollection.CollectionChanged += control.ColumnsCollectionChanged; } control.UpdateColumns(); } private void ColumnsCollectionChanged( object sender, NotifyCollectionChangedEventArgs e) { // optionally take e.Action into account UpdateColumns(); } private void UpdateColumns() { ... }