繁体   English   中英

将DataGrid TwoWay绑定到对象的ObservableList

[英]Binding a DataGrid TwoWay to an ObservableList of objects

我有一个存储数据的类:

public enum ColumnType
{
...
}

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

和它在我的UserControl中的ObservableCollection:

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

此集合绑定到DataGrid:

<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-event和Validation。 我的错在哪里

谢谢。 最好的祝福

永远不会触发该事件,因为您永远不会将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));

        }
    }

现在这将工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM