【发布时间】:2018-02-27 00:06:38
【问题描述】:
我有一个在模型类中定期更新的列表对象。我想使用计算属性将这些更改从我的模型传播到我的视图。
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private Zebra MyZebra { get; } = new Zebra();
public IList<Stripe> StripeCollection => MyZebra.Stripes;
public ViewModel()
{
MyZebra.StripesChanged += (sender, args) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("StripeCollection"));
}
}
我像这样绑定到 WPF 对象的 ItemsSource:
ItemsSource="{Binding StripeCollection}"
当事件触发时,它不会更新我的绑定。当我在触发 PropertyChanged 事件之前输入断点时,我看到我的集合确实更新了我希望它在模型和视图模型中的方式。
如果我改变这一行:
public IList<Stripe> StripeCollection => MyZebra.GetStripes;
到:
public IList<Stripe> StripeCollection => new List<Stripe>(MyZebra.GetStripes);
绑定确实更新了。但是,我对每次条纹更改时都复制列表不感兴趣。 (显然斑马经常更换条纹)。
MyZebras 内部的 List 会经常更新,但 list 对象本身永远不会重新分配。
为什么会这样?有没有办法在不重建列表的情况下触发更新?
【问题讨论】:
-
MyZebra.StripesChanged 的实际类型是什么?
-
public event EventHandler StripesChanged; -
我复制粘贴错位了,想问一下集合的实际类型是什么
MyZebra.Stripes -
另一种方法是查看
ObservableCollection而不是IList -
@JordyvanEijk 很遗憾,我无法更改 Zebra 的实现。