2
说我有这个域实体:绑定IEnumerable的MVVM属性的正确方法,是不是可观察集合
public class Foo
{
public string Name { get; set; }
public IEnumerable<Bar> Bars { get; set; }
}
现在,让我们说,我需要将Bars
属性绑定到一个WPF/MVVM应用一个DataGrid 。通知视图Bars
属性更改的适当方式是什么?我看到几个选项:
- 变更条是一个ObservableCollection
- 创建一个新的属性,在视图模型,这是一个ObservableCollection那才是真正的酒吧的副本。
- 刷新整个视图
- 其他/更好?
我可以做#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; }
}
如果您知道它何时发生变化,请在此处提出PropertyChanged(“酒吧”)。如果不是,n.2是正确的选项。 –
我发布这个问题之前实际上已经尝试过了,但没有奏效。也许我还有其他的错误... –
我实际上为'Foo'和'Bar'创建了一个单独的视图模型,并使用这些视图模型... –