首页 > 解决方案 > WPF DataGrid 仅从构造函数填充

问题描述

我觉得我错过了一些非常小的东西,但我无法弄清楚问题是什么。我已经在一个简单的应用程序中提取了我正在尝试做的事情(以及问题)。

在我的MainWindow.xaml我有(只有一个数据网格和一个按钮):

<Grid>
  <Grid.RowDefinitions>
    <RowDefinitions Height="auto"/>
    <RowDefinitions Height="auto"/>
  <Grid.RowDefinitions>
  <Button Content="Click me" Click="Button_Click"/>
  <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding TableResult}" Grid.Row="1"/>
</Grid>

在我的MainWindow.xaml.cs(MainWindow 构造函数和按钮事件)中:

private MyViewModel myView;

public MainWindow()
{
  InitializeComponent();
  myView = new MyViewModel();
  DataContext = myView;
}

private void Button_Click(...) => myView.FillTable();

在我的MyViewModel.cs 中

class MyViewModel : INotifyPropertyChanged
{
  private DataTable tableResult = new DataTable();
  public DataTable TableResult
  { 
    get => tableResult;
    set
    {
      if(tableResult == value)
        return;
      tableResult = value;
      NotifyPropertyChanged(); // The event handler works fine, I just didn't type it out
    }

  public MyViewModel()
  {
    FillTable();
  }

  public void FillTable()
  {
    TableResult.Clear();
    TableResult.Columns.Clear();
    TableResult.Columns.Add(new DataColumn() { ColumnName = "Color" });
    TableResult.Columns.Add(new DataColumn() { ColumnName = "Is it Cool?" });
    TableResult.Rows.Add(new object[]{ "Red", "Yes" });
    TableResult.Rows.Add(new object[]{ "Pink", "Absolutely not" });
  }
}

问题出在某个地方(我认为),MyViewModel该类可以正常工作,但前提FillTable()在构造函数内部。每当我FillTable()退出构造函数并尝试FillTable()通过单击按钮进行调用时,表格永远不会出现。

同样,如果我离开FillTable()构造函数,表格生成就好了!但是,如果我单击该按钮,表格将完全消失并且永远不会重新生成。

我错过了什么吗?如果我将这种类型的方法与 an ObservableCollectionof一起使用string,它可以正常工作。如果有人可以指出我正在犯的这个错误或我没有看到的东西,请提前感谢。

标签: c#wpf

解决方案


你应该试试这个

public void FillTable()
{
   var res = new DataTable();
   res.Columns.Add(new DataColumn() { ColumnName = "Color" });
   res.Columns.Add(new DataColumn() { ColumnName = "Is it Cool?" });
   res.Rows.Add(new object[]{ "Red", "Yes" });
   res.Rows.Add(new object[]{ "Pink", "Absolutely not" });
   TableResult = res;
}

我相信您的问题是由于仅操作 TableResult 根本不会调用 set 属性,只有在您为属性分配了新的 TableResult 时才会调用它。


推荐阅读