【问题标题】:MVVM / ObservableCollection QuestionMVVM / ObservableCollection 问题
【发布时间】:2011-07-04 15:47:27
【问题描述】:

我有以下 XAML:

   <Grid x:Name="LayoutRoot">
        <sdk:DataGrid AutoGenerateColumns="True" Margin="46,38,0,40" x:Name="FamilyListGrid" HorizontalAlignment="Left" Width="475" 
               ItemsSource="{Binding FamilyList}"
               SelectedItem="{Binding SelectedFamily, Mode=TwoWay}" />
    </Grid>

绑定中使用的我的 FamilyList 属性是我的视图模型类中实体的 ObservableCollection。我发现我需要在我的 FamilyList 集合的设置器中实现 INotifyPropertyChanged,否则绑定不起作用。我的理解是 ObservableCollection 已经实现了这一点。如果是这种情况,为什么我需要实现 notify 属性?

如果有帮助,这是我的 FamilyList 属性定义:

    private ObservableCollection<Services.Family> familyList;
    public ObservableCollection<Services.Family> FamilyList
    {
        get { return familyList; }
        private set 
        { 
            familyList = value;
            NotifyPropertyChanged("FamilyList");
        }
    }

【问题讨论】:

    标签: wpf silverlight mvvm


    【解决方案1】:

    ObservableCollection&lt;T&gt; 实现INotifyCollectionChanged 通知注册的事件处理程序有关集合中的更改(添加、删除、排序项目)。但是,DataGrid 必须知道您的业务对象之一的属性是否已更改以更新网格中的值。为此,需要INotifyPropertyChanged
    ObservableCollection&lt;T&gt; 也实现了INotifyCollectionChanged。但是,这只能用于在集合的属性已更改时得到通知。没有任何机制可以让集合检测您的业务对象是否已更改(如果发生更改,它将注册到您的业务对象的 INotifyCollectionChanged :)。

    【讨论】:

      【解决方案2】:

      ObservableCollection 知道如何通知集合是否更改,即添加或删除项目。

      但是,如果您执行以下操作:

      FamilyList = new ObservableCollection<FamilyList>(); 
      // or
      FamilyList = GetFamilyList();
      

      那么您实际上是在更改保存您的收藏的属性,这是不同的。我猜这就是这里的问题。

      【讨论】:

        【解决方案3】:

        ObservableCollection 的 INotifyPropertyChanged 实现基本上用于对添加到该集合或从该集合中删除做出反应。

        您需要在 setter 中调用 Notify...(),因为集合是 ViewModel 的属性,DataGrid 不会对 ViewModel 属性的任何更改做出反应,除非您在调用 Notify...() 时改变了。

        编辑: 我太慢了。

        【讨论】:

          【解决方案4】:

          只要在绑定列表/DataContext 设置之前创建了保存集合的属性,就应该没问题。如果收藏品被替换,正如@Phil Sandler 所说,您需要通知。如果您只在声明变量时或在类的构造函数内部执行 new,则不需要为 that 属性更改通知属性。如果需要清空列表,我建议使用集合的 Clear 方法,不要替换它。

          【讨论】:

            【解决方案5】:

            您正在更改可观察集合的实例,而不是可观察集合的内容。所以这个集合没有什么需要通知的。

            【讨论】:

              【解决方案6】:

              如果集合本身添加或删除项目,您不需要通知。但是,如果您将整个集合换成新的/不同的实例(即familyList = new ObservableCollection&lt;Services.Family&gt;()),您需要通知。如果您确实要更改实例,请考虑清除/重新填充集合。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-09-18
                • 2014-06-26
                • 1970-01-01
                相关资源
                最近更新 更多