从另一个窗口更新WPF中的DataGrid

我在名为MainWindow的窗口上有一个DataGrid控件.从MainWindow我打开另一个名为NewCustomerWindow的窗口,点击按钮时使用以下代码.

NewCustomerWindow newCustomerWindow = new NewCustomerWindow();
newCustomerWindow.ShowDialog();

在NewCustomerWindow中,我有一个带有文本框的表单,有人可以输入有关客户的信息,然后将这些信息保存到数据库中.保存这些信息后,我想更新MainWindow中的DataGrid,所以我使用以下代码

var mainWindow = Application.Current.Windows
                .OfType<MainWindow>()
                .FirstOrDefault(window => window is MainWindow);

mainWindow.customersGrid.Items.Add(new 
            {
                CustomerID = txtCustomerID.Text,
                CompanyName = txtCompanyName.Text,
                ContactName = txtContactName.Text,
                ContactTitle = txtContactTitle.Text,
                Address = txtAddress.Text,
                City = txtCity.Text,
                Region = txtRegion.Text,
                PostalCode = txtPostalCode.Text,
                Country = txtCountry.Text,
                Phone = txtPhone.Text,
                Fax = txtFax.Text
            });

上面的代码返回以下错误:“当ItemsSource正在使用时,操作无效.请改为使用ItemsControl.ItemsSource访问和修改元素.”

customersGrid是MainWindow中DataGrid的名称,其结构如下.

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="8,29,8,8" Name="customersGrid" VerticalAlignment="Stretch" Loaded="customersGrid_Loaded">
        <DataGrid.Columns>
            <DataGridTextColumn Width="Auto" Binding="{Binding CustomerID}" Header="Κωδικός Πελάτη"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding CompanyName}" Header="Όνομα Εταιρίας"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding ContactName}" Header="Όνομα Επαφής"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding ContactTitle}" Header="Τίτλος Επαφής"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Address}" Header="Διεύθυνση"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding City}" Header="Πόλη"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Region}" Header="Περιοχή"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding PostalCode}" Header="Ταχυδρομικός Κώδικας"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Country}" Header="Χώρα"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Phone}" Header="Τηλέφωνο"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Fax}" Header="Fax"/>
        </DataGrid.Columns>
    </DataGrid>

我想解决方案是使用所有数据再次设置DataGrid的ItemsSource属性,但这不是一个好的选择,因为客户数据来自wcf服务,它带来了大量记录.那么,这个问题的解决方案是什么?先感谢您.

最佳答案 你设置你的MainWindow.DataContext = MainViewModel.Instance

(你选择创建单身还是不单身)

你的MainViewModel类应该有一个observableCollection依赖属性,让我们称之为Customers.
您将DataGrid绑定到Customers

<DataGrid ItemsSource="{Binding Customers}" />

因此,当您想要更新数据网格时,您只需更新客户(例如来自NewCustomerWindow),dataGrid将自动更新

这是很好的例子:

A-Practical-Quick-start-Tutorial-on-MVVM-in-WPF

DataGrid Tutorial

点赞