我有一个带有DataGrid的页面和一个向DataGrid中添加新Item的按钮。当我单击按钮项时,它不会显示,但通过调试器,我可以看到它被添加到了DataGrid中。
我试图将页面的XAML和CodeBehind复制到一个新窗口中,它开始工作,但我需要它在页面内工作。
我有一个页面的构造函数,我在其中定义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 = "";
}
我有一个点击事件处理程序,在那里我添加了一个新的项目
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; }
}
Window和Page的XAML和CodeBehind是相同的,我只是更改了一个构造函数名称,但当它是Page时,新项不会显示在DataGrid中,而当它是Window时,一切都正常工作。
可能是什么问题?
正确的方法是使用数据网格的ItemSource属性并将其绑定到ObservableCollection。这样,当您执行添加按钮时,只需将新对象添加到ObservableCollection中。
这太愚蠢了。
在CCD_ 2方法的第一行上,我创建CCD_;清除";此操作创建一个新的DataGrid
,该CCD_5在内存中表示,但不在Page
上。所以这就是为什么我没有看到任何变化。
清除它的正确方法是调用dgMain.Items.Clear()
方法。