【问题标题】:Update DataGrid in WPF from another window从另一个窗口更新 WPF 中的 DataGrid
【发布时间】:2012-12-21 04:18:23
【问题描述】:

我在名为 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 服务。那么,什么是解决这个问题的好方法呢?提前谢谢你。

【问题讨论】:

  • 你应该将你的dataGrid绑定到一些viewmodels依赖属性并更新属性而不是寻找主窗口
  • 你好@makc。您能否提供一些有关您的建议的更多信息,因为我对此并不熟悉。谢谢。
  • 你的 DataGrid/Window 的 DataContext 是什么?
  • 目前在我的代码中我设置了 ItemsSource 而不是 DataContext。

标签: wpf data-binding wpfdatagrid


【解决方案1】:

你设置你的MainWindow.DataContext = MainViewModel.Instance (您可以选择是否创建单例)

您的 MainViewModel 类应该有一个 observableCollection 依赖属性,我们可以称它为客户。 您将 DataGrid 绑定到客户

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

所以当您想要更新数据网格时,您只需更新客户(例如从 NewCustomerWindow),数据网格将自动更新

这里有很好的例子:

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

DataGrid Tutorial

【讨论】:

  • 感谢您的进一步解释和链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多