我有一个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>
如果我可能遗漏了任何负面影响,请发表评论。谢谢你的帮助!
答案 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,因此,如果其项目被修改,则 更改将反映在网格中。因此,分组,排序, 和统计功能将更新。
答案 2 :(得分:0)
我不确定您是否在帖子中提供了足够的信息,但我会尽力提供帮助。我的第一个问题之一是:你如何绑定到复选框?必须注意的是,如果您希望复选框影响可观察集合,则必须对项目建立“双向”绑定,默认情况下绑定是“单向”并且不会自动更改集合中的项目。处理此问题的另一种方法是在复选框上添加一个事件,当您单击时,您将手动更改可观察集合中的值。
答案 3 :(得分:0)
答案是我需要将UpdateSourceTrigger设置为PropertyChanged(请参阅Blam的响应)。似乎不需要指定双向绑定。以下是工作代码中的标记:
<DataGridCheckBoxColumn Binding="{Binding Path=Selected,
UpdateSourceTrigger=PropertyChanged}"
Header="Selected"></DataGridCheckBoxColumn>