为什么 DataGrid 在代码隐藏中添加时不显示数据表中的新列



我正在代码隐藏的DataTable中添加/删除列和行。在我的 xaml 代码中,我有一个 DataGrid,其中 ItemsSource 绑定到数据表,但 DataGrid 不显示新列或删除的列。行工作正常。

这是我背后的代码:

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    this.Table = new DataTable();
}
private DataTable _Table;
public DataTable Table
{
    get { return this._Table; }
    set { this._Table = value; }
}
public void AddColumn()
{
    this.Table.Columns.Add("ColumnTest");
}
public void AddRow()
{
    this.Table.Rows.Add();
}

Xaml:

<DataGrid Name="dgdMain" 
          Grid.Column="1"
          AutoGenerateColumns="True"
          ItemsSource="{Binding Path=Table.DefaultView}">
</DataGrid>

添加列或行的方法由按钮单击事件调用。如果我在绑定之前添加了一些列,则列会正确显示。

默认情况下不会。您必须自己添加任何新列:

public void AddColumn()
{
    this.Table.Columns.Add("ColumnTest");
    dgdMain.Columns.Add(new DataGridTextColumn() { Binding = new Binding("ColumnTest"), Header = "ColumnTest" });
}

只有在设置数据网格的ItemsSource时,才会自动生成这些列。在此之后动态添加到DataTable的任何新列都不会自动添加到DataGrid中。

数据网格不监视基础数据表数据源上的架构更改。如果要更新数据网格,请更改 AddColumn 方法并在代码隐藏上实现 INotifyPropertyChanged。如果将此代码从代码隐藏移动到 ViewModel(强烈推荐(,则还需要在那里实现 INotifyPropertyChanged。

public void AddColumn()
{
    this.Table.Columns.Add("ColumnTest");
    OnPropertyChanged(nameof(Table));
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName) => 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

最新更新