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()方法。