繁体   English   中英

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

[英]How do I update an ObservableCollection item's property from change in a WPF DataGrid?

我有一个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>

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

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

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

我认为绑定到返回_itemDataCol的公共属性更加清晰

否则就是celopez3的TwoWay答案

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

换句话说,[ ObservableCollection ]仅在添加或删除项目时注意,而不是在项目的值发生更改时注意,即使这些项目实现了INotifyPropertyChanged。 相比之下,BindingList DOES侦听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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM