如何从WPF DataGrid中的更改更新ObservableCollection项的属性?

时间:2012-04-02 21:42:35

标签: c# wpf binding wpfdatagrid observablecollection

我有一个WPF DataGrid谁的数据源是一个ObservableCollection。它松散地设置如下:

public class ItemDataCollection : ObservableCollection<ItemData>
{
}

public class ItemData : INotifyPropertyChanged
{
    private bool _selected = true;
    public bool Selected 
    { 
        get
        {
            return _selected;
        }
        set
        {
            if (value != _selected)
            {
                _selected = value;
                NotifyPropertyChanged("Selected");
            }
        }
    }
    }


    _itemDataCol = new ItemDataCollection();
        <... fill the _itemDataCol with data here ...>
    dataGrid1.ItemsSource = _itemDataCol;

更新集合时,dataGrid1.Items.Refresh()会很好地更新dataGrid1。但是,当我通过选中或取消选中与该属性对应的行中的复选框来修改行的“Selected”属性时,集合中的项目不会更新。我查看了ObeservableCollection的CollectionChanged事件,但是看起来并没有触发。我需要什么接线才能让dataGrid1更新集合。

更新

我所做的只是将ItemSource属性设置为ObservableCollection并让列自动生成。我已经改为直接绑定,并找到了问题的更多细节。当我只选中复选框时 - 不会触发任何通知。但是,如果我在选中此框后点击,则会更新集合。这是绑定:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay}" Header="Selected"></DataGridCheckBoxColumn>

所以我想问题是如何在检查或取消选中此框后点击更新?

更新#2 (我无法回答,因为我的代表还不够高) 好的 - 我想我有解决方案。如果我在绑定中包含“UpdateSourceTrigger = PropertyChanged”,则一切似乎都有效。

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Selected"></DataGridCheckBoxColumn>

如果我可能遗漏了任何负面影响,请发表评论。谢谢你的帮助!

4 个答案:

答案 0 :(得分:4)

CollectionChanged用于插入和删除。 NotifyPropertyChanged用于更新项目。在发布的代码中,您实际上并未实现INotifyPropertyChanged。

   public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

我认为绑定到返回_itemDataCol

的公共属性更加清晰

否则是celopez3的TwoWay答案

答案 1 :(得分:2)

ObservableCollection不会收听其项目的INotifyPropertyChanged个事件;改为使用BindingList

  

换句话说,[ObservableCollection]仅在添加或删除项目时注意到,而不是   当其项目的值发生变化时,即使这些项目实施   INotifyPropertyChanged的。相比之下,BindingList会听取   INotifyPropertyChanged,因此,如果其项目被修改,则   更改将反映在网格中。因此,分组,排序,   和统计功能将更新。

http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

答案 2 :(得分:0)

我不确定您是否在帖子中提供了足够的信息,但我会尽力提供帮助。我的第一个问题之一是:你如何绑定到复选框?必须注意的是,如果您希望复选框影响可观察集合,则必须对项目建立“双向”绑定,默认情况下绑定是“单向”并且不会自动更改集合中的项目。处理此问题的另一种方法是在复选框上添加一个事件,当您单击时,您将手动更改可观察集合中的值。

答案 3 :(得分:0)

答案是我需要将UpdateSourceTrigger设置为PropertyChanged(请参阅Blam的响应)。似乎不需要指定双向绑定。以下是工作代码中的标记:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected,
     UpdateSourceTrigger=PropertyChanged}" 
     Header="Selected"></DataGridCheckBoxColumn>