2013-07-22 49 views
2

说我有这个域实体:绑定IEnumerable的MVVM属性的正确方法,是不是可观察集合

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

现在,让我们说,我需要将Bars属性绑定到一个WPF/MVVM应用一个DataGrid 。通知视图Bars属性更改的适当方式是什么?我看到几个选项:

  1. 变更条是一个ObservableCollection
  2. 创建一个新的属性,在视图模型,这是一个ObservableCollection那才是真正的酒吧的副本。
  3. 刷新整个视图
  4. 其他/更好?

我可以做#1,但我不喜欢视图的需要导致域实体改变。

2号似乎确定,但有点hackish。

3号似乎效率低下。

最好的方法是什么?

编辑

为完整的基础上,西蒙的回答,我这样做:

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; } 
    } 
+0

如果您知道它何时发生变化,请在此处提出PropertyChanged(“酒吧”)。如果不是,n.2是正确的选项。 –

+0

我发布这个问题之前实际上已经尝试过了,但没有奏效。也许我还有其他的错误... –

+0

我实际上为'Foo'和'Bar'创建了一个单独的视图模型,并使用这些视图模型... –

回答

4

在最佳实践一种-的路,你的观点不应该直接绑定到你的模型:这就是你的视图模型的用途。理想情况下,您需要#2以实现最大分离,并在适当时将逻辑同步到模型。

相关问题