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

2024-02-07

我在名为 MainWindow 的窗口上有一个 DataGrid 控件。从 MainWindow 中,我通过单击按钮使用以下代码打开另一个名为 NewCustomerWindow 的窗口。

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

在 NewCustomerWindow 中,我有一个带有文本框的表单,可以在其中输入有关客户的信息,然后将这些信息保存到数据库中。保存这些信息后,我想更新主窗口中的 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 绑定到 Customer

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

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

这里有一些很好的例子:

WPF 中的 MVVM 实用快速入门教程 http://www.codeproject.com/Articles/81484/A-Practical-Quick-start-Tutorial-on-MVVM-in-WPF

数据网格教程 http://www.wpftutorial.net/DataGrid.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从另一个窗口更新 WPF 中的 DataGrid 的相关文章

随机推荐

  • WPF如何将mousedown(命令/操作)绑定到标签

    我可以找到很多到按钮的命令鼠标绑定 但是如果我想将 mousedown 事件绑定到绑定 MVVM 模式 怎么办 我找不到答案 可能是我看不到的很小的东西 但有人可以帮助我吗 xaml
  • SQL Server 2008 R2 中的高效分页

    我想编写一个执行以下操作的存储过程 返回匹配查询的记录数 以确定向用户显示的页数 返回另一个记录集 其中包含当前页面查询中的某个记录子集 从我在 StackOverflow 上发现的另一个问题 抱歉 我丢失了链接 我发现我们是这样进行分页的
  • 在哪里可以找到有关 SharePoint 的优质编程资源? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直试图找到一本书籍或 Web 参考资料 让我更好地了解如何构建 测试 ASP NET 页面 控件和 Web 部件并将其部署到 Shar
  • 防止移动 unique_ptr C++11

    有什么方法可以阻止用户显式获取唯一指针的所有权 std move Make it const The unique ptr移动构造函数需要一个非常量右值引用 因此不能用 a 调用const object const unique ptr
  • Django ORM 中 select_lated 和 prefetch_lated 有什么区别?

    在 Django 文档中 select related https docs djangoproject com en stable ref models querysets select related 遵循 外键关系 在执行查询时选择其
  • 在 Python 中缩小和合并 PDF

    我正在尝试将两个 A4 PDF 页面缩小并合并为一个 A4 页面 这样如果我有的话 p1 p2 我会得到 p1 p2 作为一个新的 PDF 其中一页有两个 A5 大小的页面 类似于在纸上每页打印两页的方式 我调查过pypdf https p
  • 当文本框中未填充任何内容时,将 mvvm WPF 中的属性设置为 null

    我实现了一个文本框 它绑定到一个视图模型 例如 我在文本框中默认填写 100 但如果我将其更改为 10 则该属性始终设置正确 但是当我删除所有数字时 我希望该属性设置为空 但它只是在没有填写任何内容时不设置该值 他只是保留最后一个值 这是我
  • Django 从数据库自动完成

    我有一个这样的模型 class Baslik models Model user models ForeignKey User null True blank True title models CharField max length 5
  • 为什么 getenv() 返回非常量字符串

    我正在阅读以下文档std getenv 功能于cppreference com http en cppreference com w cpp utility program getenv它说 修改 getenv 返回的字符串会调用未定义的行
  • 什么是多字节字符集?

    术语 多字节 是指其字符可以 但不必 宽于 1 个字节的字符集 例如 UTF 8 还是指在任何情况下都宽于 1 个字节的字符集 例如 UTF 16 换句话说 如果有人谈论多字节字符集 这意味着什么 该术语含糊不清 但在我的国际化工作中 我们
  • 将多列合并为一列

    我有一个数据集如下 GN Datum Land AG GKV MTCR GKV NSGI GKV NSGII GKV WA GKV ML GKV Wert 8 11693 2012 01 05 Kenia 5A001f 159700 9 1
  • 我将如何改进这个充当规范的 7 行 Linq 查询?

    顶部的 BigQuery 获取一组产品和嵌套的相关表 然后 我在规范模式上进行了一次糟糕的尝试应用过滤 这是过滤器代码 查询中有三个表 我想通过嵌套在底部查询中的值来过滤顶部查询 就像我说的 这目前产生了我们想要的结果 然而 Contain
  • 如何提供一系列交错线程来显示代码中断并且不提供完美的同步?

    我知道下面的代码是做什么的 我知道为什么它是一个损坏的同步代码 因为它只有一个条件变量 而我们需要两个 但我不知道如何提供一系列交错线程来显示它不起作用 您能举例说明为什么此代码不起作用吗 1 cond t cond PTHREAD CON
  • MySQL 错误 #1005(代码 150)

    我尝试过创建此表 但我尝试过的任何方法都无法从 FK 中实现 CREATE TABLE tb AutSituacao id int 11 NOT NULL AUTO INCREMENT Nome varchar 50 CHARACTER S
  • 如何将一个项目添加为另一个项目的依赖项?

    有两个独立的项目 myWarProject and MyEjbProject 所以当我构建myWarProject我需要安装MyEjbProject到本地存储库 这样我就可以在 myWarProject 中定义为依赖项并成功打包 myWar
  • 在 C 语言的 for 循环条件中调用 strlen() 的最佳替代方法是什么?

    我读到在 for 循环条件中调用 strlen 是不好的做法 因为这是一个 O N 操作 然而 在寻找替代方案时 我看到两种可能的解决方案 int len strlen somestring for int i 0 i lt len i o
  • 使用 jsoup 或 gquery 获取纯 XML

    我最近想知道有没有一个好的 Java 中 XML 操作库 一个不错的 Java XML DOM 实用程序 https stackoverflow com questions 6996013 a nice java xml dom utili
  • opencv warpPerspective 的替代方案

    我正在使用 opencv warpPerspective 函数来扭曲图像中找到的 countour 以查找轮廓 我正在使用 findContours 如下图所示 但是 warpPerspective 函数需要 更多时间 才能扭曲到完整图像
  • 如何在 spring-servlet.xml 中自动装配 CRUD 存储库?

    当我们在 spring mvc 中使用 crud 存储库时 我们收到以下错误 4352 localhost startStop 1 ERROR org springframework web context ContextLoader Co
  • 从另一个窗口更新 WPF 中的 DataGrid

    我在名为 MainWindow 的窗口上有一个 DataGrid 控件 从 MainWindow 中 我通过单击按钮使用以下代码打开另一个名为 NewCustomerWindow 的窗口 NewCustomerWindow newCusto