【发布时间】:2015-03-25 01:12:59
【问题描述】:
我有 myType1 和一个依赖属性 string Text。我创建了包含依赖属性ObservableCollection<myType1> Items 的myType2。我也有Items 的图形表示。当我按下按钮时,它将myType1.Text 设置为null。当Items 中的Item.Text 为空时,我想删除此项目。我尝试通过 `
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
ObservableCollection<StringDP> ocdp = e.NewValue as ObservableCollection<StringDP>;
foreach (var sdp in ocdp)
{
if (sdp == null)
{
ocdp.Remove(sdp);
}
}
dependencyObject.SetValue(e.Property, ocdp);
}
但是当 Item.Text 设置为 null 时它不会引发。我究竟做错了什么。谢谢!
更新
根据文档ObservableCollection 不会在项目的属性更改时引发CollectionChanged 事件。我通过继承ObservableCollection 解决了我的问题。
`public class ElObservableCollection<T>: ObservableCollection<T> where T: INotifyPropertyChanged
{
public ElObservableCollection(): base()
{
CollectionChanged += OnCollectionChanged;
}
public virtual void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (var item in Items)
{
item.PropertyChanged += OnItemChanged;
}
}
if (e.OldItems != null)
{
foreach (var item in Items)
{
item.PropertyChanged -= OnItemChanged;
}
}
}
private void OnItemChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "TextProperty" && sender is StringDP)
{
StringDP sdp = sender as StringDP;
if (sdp.Text == null)
{
this.Remove((T) sender);
}
}
}
public ElObservableCollection(List<T> list)
: base(list)
{
CollectionChanged += OnCollectionChanged;
}
public ElObservableCollection(IEnumerable<T> collection)
: base(collection)
{
CollectionChanged += OnCollectionChanged;
}
}`
【问题讨论】:
-
如果这不会引发枚举异常 -- ocdp.Remove(sdp); ?
-
对,打错了,应该是 sdp.Text == null。
标签: c# wpf binding dependency-properties