将 DataGrid 双向绑定到对象的可观察列表

本文关键字:观察 列表 对象 DataGrid 绑定 | 更新日期: 2023-09-27 18:35:18

我有一个类来存储数据:

public enum ColumnType
{
...
}
public class LogColumn
{
    public string Name { get; set; }
    public ColumnType Type { get; set; }
    public bool OrderBy { get; set; }
}

以及我的用户控件中的可观察集合:

private ObservableCollection<LogColumn> _logColumns = new ObservableCollection<LogColumn>();
public ObservableCollection<LogColumn> LogColumns
{
    get { return _logColumns; }
    set
    {
        _logColumns = value;
        OnPropertyChanged("LogColumns");
     }
 }

此集合绑定到数据网格:

<DataGrid Name="dgColumnSelection"
                  ItemsSource="{Binding LogColumns, UpdateSourceTrigger=LostFocus, Mode=TwoWay, ValidatesOnDataErrors=True}" CanUserAddRows="False" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Name, UpdateSourceTrigger=LostFocus, Mode=TwoWay,  ValidatesOnDataErrors=True}" />
        <DataGridComboBoxColumn Header="Type" ItemsSource="{Binding Source={StaticResource ColumnType}}" SelectedValueBinding="{Binding Type, UpdateSourceTrigger=LostFocus, Mode=TwoWay,  ValidatesOnDataErrors=True}" />
        <DataGridCheckBoxColumn Header="Order by" Binding="{Binding OrderBy, UpdateSourceTrigger=LostFocus, Mode=TwoWay, ValidatesOnDataErrors=True}" />
    </DataGrid.Columns>
</DataGrid>

但 PropertyChanged 事件和验证都不会触发。我的错在哪里?

感谢。此致敬意

将 DataGrid 双向绑定到对象的可观察列表

事件永远不会触发,因为您永远不会将 LogColumns 变量设置为新内容。 您正在执行的操作是更改 LogColumns 集合中包含的 LogColumn 项的属性。

在 LogColumn 类上实现 INotifyPropertyChanged 接口可能有助于实现您想要的操作。

ObservableCollection

仅在 ObservableCollection 的项目被修改时才通知,而不是更改项目项,因此您需要在 logcolumns 类中实现 inotifyproprty

 public class LogColumn : INotifyPropertyChanged
    {
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; Onchanged("Name"); }
        }
        private ColumnType _Type;

        public ColumnType Type
        {
            get { return _Type; }
            set { _Type = value; Onchanged("Type"); }
        }
        private bool _OrderBy;
        public bool OrderBy
        {
            get { return _OrderBy; }
            set { _OrderBy = value; Onchanged("OrderBy"); }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void Onchanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

现在这将起作用。