2012-04-02 303 views
3

我有一个WPF DataGrid谁的数据源是一个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

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

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

我认为这是清洁绑定到你返回_itemDataCol

否则celopez3的双向答案

+0

对不起 - 我省略了NotifyPropertyChanged的实现来保持文章简短。它在我的实际代码中正确实现。 – 2012-04-02 22:09:53

+0

它会被叫吗?集合是否被调用?请尝试绑定到公共属性。如果所有失败尝试绕过你ItemDataCollection并直接提供ObservableCollection (用于测试)。 – Paparazzi 2012-04-02 22:14:48

+0

我试过以下内容: Selected is public。问题结果是,如果在检查或取消选中该框后点击,则更新ObservableCollection。然而,仅仅检查该框并不足以触发更新。 – 2012-04-02 23:17:36

0

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

+0

我只是把ItemSource属性设置为ObservableCollection并让列自动生成。我已经改变了直接绑定,并找到了更多的细节问题。当我简单地检查框时 - 没有通知被触发。但是,如果在选中该框后点击,则会更新集合。这里是绑定: 任何想法? – 2012-04-02 23:09:51

2

ObservableCollection不听它的项目INotifyPropertyChanged事件的公共属性;改为使用BindingList

换句话说,[一ObservableCollection]只有当项目被添加或删除,而不是 当其项的值的变化,即使这些项目实施 INotifyPropertyChanged的通知。相比之下,绑定列表会监听 INotifyPropertyChanged,因此,如果其项目被修改,则 更改将反映在网格中。结果分组,排序, 和统计功能将被更新。

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

0

答案是,我需要设置UpdateSourceTrigger到的PropertyChanged(见布拉姆的反应)。双向绑定似乎不需要指定。这里是从工作代码的标记:

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

我在搞这个网站 - 这个网站还是新的。当我发现它没有选中你的时候,我重新接受了,但没有采取。这不是我的意图 - 你赢得了接受的答案。 – 2012-04-05 06:09:00

+0

这很奇怪,因为它表明你今天接受和不接受。答案显示一个复选标记,但我没有得到信用。请尝试单击复选标记。如果我没有得分,那么没问题。好,你有它的工作。 – Paparazzi 2012-04-05 12:49:08

+0

嗯。我试图不接受并再次接受。它确实将您的帖子显示为已接受的答案 - 至少在我的浏览器中使用不同的机器。我的歉意 - 你是第一个发布信誉应该是你的。这就是我得到的东西,没有被打破... – 2012-04-05 18:01:17

相关问题