绑定不是可观察集合的 IEnumerable MVVM 属性的正确方法



假设我有这个域实体:

public class Foo
{
    public string Name { get; set; }
    public IEnumerable<Bar> Bars { get; set; }
}

现在假设我需要将Bars属性绑定到WPF/MVVM应用程序中的数据网格。通知视图Bars属性已更改的适当方式是什么?我看到了一些选择:

  1. 将条形图更改为可观察的集合
  2. 在视图模型上创建一个新属性,即ObservableCollection,它是真实Bars的副本
  3. 刷新整个视图
  4. 还有别的/更好的吗

我可以做#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实现最大程度的分离,并在适当的时候将更改同步回模型。

最新更新