实现以双向方式将对象集合绑定到DataGrid

时间:2014-12-01 06:56:37

标签: wpf datagrid

我正在尝试在DataGridCollection之间实现双向绑定。 我想要的是删除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>

enter image description here

当我点击第一列中的复选框时。 PropertyChanged事件将被触发。这将使值更改为集合项。它工作。

当我点击删除按钮时。我尝试从当前绑定集合中删除指定的项目。收集项目已删除。但为什么他们的网格行没有被删除?

public void Delete()
{
    List<ConfigItem> TobeRemovedList = configs.Where(x => x.ToBeDelete.Equals(true)).ToList();
    TobeRemovedList.ForEach(x => configs.Remove(x));
}

我是否需要在删除按钮中再次调用bind,以便DataGrid知道集合已更改?

如果我所做的远离最佳做法。请告诉我怎么样。感谢。

1 个答案:

答案 0 :(得分:1)

是的。您需要使用ObservableCollection<T>而不是List<T>,因为后者不支持更改通知。因此数据绑定引擎不会知道您的列表已更改,因此无法更新DataGrid

此外,您需要将ObservableCollection<T>保留为字段,而不是一次又一次地创建新的本地变量。