Csharp/C#教程:集合依赖属性分享


集合依赖属性

我有一个自定义控件,它具有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事件处理程序附加到新集合,但也从旧集合中删除。

上述就是C#学习教程:集合依赖属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 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() { ... } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009882.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐