绑定到列表 <myType> WPF
Binding to List<myType> WPF
我 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;
}
}`
在 myType1 中创建一个引用 myType2 的 属性,这样如果 myType1 中的文本 属性 设置为空,它可以自行删除。
根据文档,当项目的 属性 更改时,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;
}
}
- 在我订阅
CollectionChanged
事件的每个构造函数中。
- 在
CollectionChanged
处理程序方法中,我订阅了每个项目的 PropertyChanged
。
- 在
PropertyChanged
处理程序方法中,我编写了所需的行为。
猜猜它会对某人有所帮助。
我 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;
}
}`
在 myType1 中创建一个引用 myType2 的 属性,这样如果 myType1 中的文本 属性 设置为空,它可以自行删除。
根据文档,当项目的 属性 更改时,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;
}
}
- 在我订阅
CollectionChanged
事件的每个构造函数中。 - 在
CollectionChanged
处理程序方法中,我订阅了每个项目的PropertyChanged
。 - 在
PropertyChanged
处理程序方法中,我编写了所需的行为。 猜猜它会对某人有所帮助。