DataGrid 在页面上时不显示新项目
DataGrid does not displaly new items when it's on Page
我有一个带有 DataGrid 的页面和一个将新项目添加到 DataGrid 的按钮。当我点击按钮时项目没有显示,但通过调试器我可以看到它被添加到 DataGrid 中。
我尝试将页面的 XAML 和 CodeBehind 复制到新的 Window 并开始工作,但我需要它在页面内部工作。
我有一个页面构造函数,我在其中定义了 dataGrid 列和 ClearPage()
在取消隐藏时清除页面的方法:
public CreateTablePage()
{
InitializeComponent();
var columnPK = new DataGridCheckBoxColumn();
columnPK.Header = "PK";
columnPK.Binding = new Binding("PK");
dgMain.Columns.Add(columnPK);
var columnName = new DataGridTextColumn();
columnName.Header = "Name";
columnName.Binding = new Binding("Name");
dgMain.Columns.Add(columnName);
var columnType = new DataGridTextColumn();
columnType.Header = "Тип";
columnType.Binding = new Binding("Type");
dgMain.Columns.Add(columnType);
var columnUQ = new DataGridCheckBoxColumn();
columnUQ.Header = "UQ";
columnUQ.Binding = new Binding("UQ");
dgMain.Columns.Add(columnUQ);
var columnNN = new DataGridCheckBoxColumn();
columnNN.Header = "NN";
columnNN.Binding = new Binding("NN");
dgMain.Columns.Add(columnNN);
}
public void ClearPage()
{
dgMain = new DataGrid();
tbColumnName.Text = "";
tbFKName.Text = "";
}
我有一个 Click 事件处理程序,我在其中添加了一个新项目
private void bAddColumn_Click(object sender, RoutedEventArgs e)
{
AddColumn();
}
private void AddColumn()
{
var data = new DbTableItem { PK = true, Name = "Test", Type = "Int", UQ = false, NN = false };
dgMain.Items.Add(data);
//debuger shows that Items was added, but nothing is displayed on datagrid
//when I run this code inside the Window it does work
}
public sealed class DbTableItem
{
public bool PK { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public bool UQ { get; set; }
public bool NN { get; set; }
}
XAML 和 CodeBehind 对于 Window 和 Page 是相同的,我只是更改了一个构造函数名称,但是当它是 Page 时,DataGrid 中没有显示新项目,当它是 Window 一切正常。
可能是什么问题?
正确的方法是使用数据网格的 ItemSource 属性 并将其绑定到 ObservableCollection。这样当您执行添加按钮时,只需将新对象添加到 ObservableCollection 中即可。
好吧,那是超级愚蠢的。
在 ClearPage()
方法的第一行,我创建了 DataGrid
的一个新实例并将其分配给 dgMain
以“清除”它。此操作创建一个新的 DataGrid
,它在内存中表示,但不在 Page
上。所以这就是为什么我没有看到它有任何变化。
清除它的正确方法是调用dgMain.Items.Clear()
方法。
我有一个带有 DataGrid 的页面和一个将新项目添加到 DataGrid 的按钮。当我点击按钮时项目没有显示,但通过调试器我可以看到它被添加到 DataGrid 中。
我尝试将页面的 XAML 和 CodeBehind 复制到新的 Window 并开始工作,但我需要它在页面内部工作。
我有一个页面构造函数,我在其中定义了 dataGrid 列和 ClearPage()
在取消隐藏时清除页面的方法:
public CreateTablePage()
{
InitializeComponent();
var columnPK = new DataGridCheckBoxColumn();
columnPK.Header = "PK";
columnPK.Binding = new Binding("PK");
dgMain.Columns.Add(columnPK);
var columnName = new DataGridTextColumn();
columnName.Header = "Name";
columnName.Binding = new Binding("Name");
dgMain.Columns.Add(columnName);
var columnType = new DataGridTextColumn();
columnType.Header = "Тип";
columnType.Binding = new Binding("Type");
dgMain.Columns.Add(columnType);
var columnUQ = new DataGridCheckBoxColumn();
columnUQ.Header = "UQ";
columnUQ.Binding = new Binding("UQ");
dgMain.Columns.Add(columnUQ);
var columnNN = new DataGridCheckBoxColumn();
columnNN.Header = "NN";
columnNN.Binding = new Binding("NN");
dgMain.Columns.Add(columnNN);
}
public void ClearPage()
{
dgMain = new DataGrid();
tbColumnName.Text = "";
tbFKName.Text = "";
}
我有一个 Click 事件处理程序,我在其中添加了一个新项目
private void bAddColumn_Click(object sender, RoutedEventArgs e)
{
AddColumn();
}
private void AddColumn()
{
var data = new DbTableItem { PK = true, Name = "Test", Type = "Int", UQ = false, NN = false };
dgMain.Items.Add(data);
//debuger shows that Items was added, but nothing is displayed on datagrid
//when I run this code inside the Window it does work
}
public sealed class DbTableItem
{
public bool PK { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public bool UQ { get; set; }
public bool NN { get; set; }
}
XAML 和 CodeBehind 对于 Window 和 Page 是相同的,我只是更改了一个构造函数名称,但是当它是 Page 时,DataGrid 中没有显示新项目,当它是 Window 一切正常。
可能是什么问题?
正确的方法是使用数据网格的 ItemSource 属性 并将其绑定到 ObservableCollection。这样当您执行添加按钮时,只需将新对象添加到 ObservableCollection 中即可。
好吧,那是超级愚蠢的。
在 ClearPage()
方法的第一行,我创建了 DataGrid
的一个新实例并将其分配给 dgMain
以“清除”它。此操作创建一个新的 DataGrid
,它在内存中表示,但不在 Page
上。所以这就是为什么我没有看到它有任何变化。
清除它的正确方法是调用dgMain.Items.Clear()
方法。