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

时间:2013-07-22 12:48:48

标签: c# wpf mvvm

说我有这个域名实体:

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

现在假设我需要将Bars属性绑定到WPF / MVVM应用程序中的数据网格。通知视图Bars属性发生了变化的适当方法是什么?我看到了几个选项:

  1. 将条形图更改为ObservableCollection
  2. 在视图模型上创建一个新属性,它是一个ObservableCollection,它是真实条形的副本。
  3. 刷新整个视图
  4. 还有什么/更好吗?
  5. 我可以做#1,但我不喜欢视图的需要导致域实体发生变化。

    2号似乎没问题,但有点ha ..

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

1 个答案:

答案 0 :(得分:4)

在最佳实践中,您的视图不应直接绑定到您的模型:这就是您的视图模型的用途。理想情况下,您希望#2获得最大分离,并在需要时使用逻辑将更改同步回模型。