假设我有这个域实体:
public class Foo
{
public string Name { get; set; }
public IEnumerable<Bar> Bars { get; set; }
}
现在假设我需要将Bars
属性绑定到WPF/MVVM应用程序中的数据网格。通知视图Bars
属性已更改的适当方式是什么?我看到了一些选择:
- 将条形图更改为可观察的集合
- 在视图模型上创建一个新属性,即ObservableCollection,它是真实Bars的副本
- 刷新整个视图
- 还有别的/更好的吗
我可以做#1,但我不喜欢视图的需要导致域实体发生更改。
2号看起来不错,但有点生气。
3号似乎效率低下。
最好的方法是什么?
编辑
为了完整起见,根据Simon的回答,我这样做了:
public Foo SelectedFoo
{
get { return _selectedFoo; }
set
{
_selectedFoo = value;
this.NotifyPropertyChanged(() => this.Foo);
_bars = new ObservableCollection<Bar>();
if (_selectedFoo.Bars != null) { _bars.AddRange(_selectedFoo.Bars); }
this.NotifyPropertyChanged(() => this.Bars);
}
}
private ObservableCollection<Bar> _bars;
public ObservableCollection<Bar> Bars
{
get { return _bars; }
}
在最佳实践中,视图不应直接绑定到模型:这就是视图模型的用途。理想情况下,您希望#2实现最大程度的分离,并在适当的时候将更改同步回模型。