【问题标题】:Why does DataGrid not show new columns from DataTable when added in code behind?为什么 DataGrid 在后面的代码中添加时不显示来自 DataTable 的新列?
【发布时间】:2017-11-14 02:15:40
【问题描述】:

我在后面的代码中向 DataTable 添加/删除列和行。在我的 xaml 代码中,我有一个 DataGrid,它的 ItemsSource 绑定到 DataTable,但 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>

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

【问题讨论】:

  • 试试ItemsSource="{Binding Table}"。这假设您已正确设置视图DataContext
  • 谢谢,但还是一样的问题。

标签: c# wpf xaml data-binding datagrid


【解决方案1】:

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

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

这些列仅在您设置 DataGrid 的ItemsSource 时自动生成。在此之后动态添加到DataTable 的任何新列都不会自动添加到DataGrid

【讨论】:

    【解决方案2】:

    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));
    

    【讨论】:

    • CallerMemberNameAttribute 在对OnPropertyChanged(); 的调用中做了什么?提高“AddColumn”的 PropertyChanged 似乎没有帮助。为“Table”提高它也无济于事(我刚刚测试过)。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2019-03-26
    • 2014-09-11
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2011-08-14
    • 2019-12-16
    相关资源
    最近更新 更多