如何更新ObservableCollection项目';s属性在WPF数据网格中的更改

本文关键字:数据 WPF 属性 数据网 网格 更新 何更新 ObservableCollection 项目 | 更新日期: 2023-09-27 18:29:43

我有一个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"属性时,集合中的项目不会得到更新。我查看了ObservableCollection的CollectionChanged事件,但似乎没有得到triggerd。我需要什么连接才能获得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>

如果我可能错过了任何负面影响,请留下评论。谢谢你的帮助!

如何更新ObservableCollection项目';s属性在WPF数据网格中的更改

CollectionChanged用于插入和删除。NotifyPropertyChanged用于更新项。在发布的代码中,您实际上并没有实现INotifyPropertyChanged。
   public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

我认为绑定到返回_itemDataCol 的公共属性更干净

否则,celopez3 的双向答案

ObservableCollection不监听其项的INotifyPropertyChanged事件;请改用BindingList

换言之,[anObservableCollection]只会在添加或删除项目时发出通知,而不会当其项的值发生更改时,即使这些项实现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

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

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

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