集合依赖属性
我有一个自定义控件,它具有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