我正在尝试在DataGrid
和Collection
之间实现双向绑定。
我想要的是删除Collection
中的项目会自动导致DataGrid
项目被移除,是否有可能成功?
到目前为止我所做的是:
我的收藏品的代码。
[XmlRoot("configitem")]
public class ConfigItem : INotifyPropertyChanged
{
private bool bDelete = false;
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public string Value { get; set; }
public bool ToBeDelete {
get
{
return bDelete;
}
set
{
bDelete = value;
OnPropertyChanged("ToBeDelete");
}
}
[XmlAttribute("description")]
public string Description { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML代码是:
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Content="All" x:Name="chkAll" Click="chkAll_Click" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="chkSelect" IsChecked="{Binding ToBeDelete,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="15 2 0 0" Click="chkSelect_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="2*" Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="ConfigName"/>
<DataGridTextColumn Width="2*" Binding="{Binding Value}" ClipboardContentBinding="{x:Null}" Header="ConfigValue"/>
<DataGridTextColumn Width="6*" Binding="{Binding Description}" ClipboardContentBinding="{x:Null}" Header="Description"/>
</DataGrid.Columns>
当我点击第一列中的复选框时。
PropertyChanged
事件将被触发。这将使值更改为集合项。它工作。
当我点击删除按钮时。我尝试从当前绑定集合中删除指定的项目。收集项目已删除。但为什么他们的网格行没有被删除?
public void Delete()
{
List<ConfigItem> TobeRemovedList = configs.Where(x => x.ToBeDelete.Equals(true)).ToList();
TobeRemovedList.ForEach(x => configs.Remove(x));
}
我是否需要在删除按钮中再次调用bind,以便DataGrid知道集合已更改?
如果我所做的远离最佳做法。请告诉我怎么样。感谢。
答案 0 :(得分:1)
是的。您需要使用ObservableCollection<T>
而不是List<T>
,因为后者不支持更改通知。因此数据绑定引擎不会知道您的列表已更改,因此无法更新DataGrid
。
此外,您需要将ObservableCollection<T>
保留为字段,而不是一次又一次地创建新的本地变量。