WPF MVVM 可观察集合不更新 GUI

2024-04-15

我正在设计一个 MVVM WPF 应用程序,并且有一个 ViewModel,它有一个名为 SelectedCustomer 的属性,类型为 Customer。该对象有一个名为 SummaryDetails 的 ObservableCollection 类型的属性,它逐行呈现到 ListView 中。

为此,我在 ViewModel 上创建了一个名为 CustomerSummaryDetails 的单独属性,它仅包含一个 get,它返回我上面提到的客户中包含的集合。

在 XAML 中,我已将 ItemsSource 绑定到 CustomerSummaryDetails 属性。

这样我就不必绑定到不太干净的 SelectedCustomer.SummaryDetails 。

SelectedCustomer 属性具有 get 和 set 方法,并且 set 为 OTHER 属性 CustomerSummaryDetails 调用 OnPropertyChanged,让 XAML 知道基础集合已更改并进行更新。

问题是,当我更新集合中的项目时,尽管调用了所有正确的事件,但它并没有反映在 GUI 上。我已经介入并调用了 SelectedCustomer 的 set 方法,然后按照 OnPropertyChanged("CustomerSummaryDetails") 调用进行操作,该调用按预期进入 CustomerSummaryDetails 属性的“get”方法。此时我已经深入研究了返回集合的值,列表中的值是更新后的值,但是 GUI 上没有反映任何内容,所以我很困惑,因为 GUI 似乎正在调用 get 方法来更新它在 OnPropertyChanged() 调用上,但它没有在视觉上反映出来。

更新 - 包含代码

抱歉,没有包含代码,我认为描述起来会更容易,但这里是主要的 ViewModel 属性

public CustomerSummaryViewModel SelectedCustomer
{
    get { return _selectedCustomer; }
    set
    {
        _selectedCustomer = value;
        OnPropertyChanged("CustomerSummaryDetails");
    }
}

public ObservableCollection<RbcUICustomerSummary> CustomerSummaryDetails
{
    get { return _selectedCustomer.SummaryDetails; }
}

public ItemSummaryViewModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem = value;
        OnPropertyChanged("SelectedItem");
    }
}

下面的 XAML

    <ListView x:Name="lvCustomerSummary" Margin="10,10,10,10" Background="#F4F8FB" ItemsSource="{Binding CustomerSummaryDetails}" MouseDoubleClick="lvCustomerSummary_MouseDoubleClick" ItemContainerStyle="{StaticResource myHeaderStyleColor}" VirtualizingStackPanel.IsVirtualizing="False" VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}">
                    <GridView.Columns>
                    <GridViewColumn Header=""  >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate >
                                <Grid>
                                    <Image Source="{z:ImageStaticResource {Binding IconSelect}}" Width="20" Height="20" />
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="200" Header="SubCustType" DisplayMemberBinding="{Binding SubCustType}" >
                    </GridViewColumn>
                    <GridViewColumn Width="200" Header="SubCustValue"  DisplayMemberBinding="{Binding SubCustValue}">
                    </GridViewColumn>
                    <GridViewColumn Header=""  >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate >
                                <Grid>
                                    <Image Source="{z:ImageStaticResource {Binding IconFlag}}" Width="20" Height="20" />
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

最后是执行实际更新的 Updater 方法

private void DisplayCustomerComment(string commentEnt)
{            
    if (_queueViewModel.SelectedCustomer == null) return;
        var selCust = _queueViewModel.SelectedCustomer;

    foreach (var t in selCust.SummaryDetails
        .Where(t => t.SubCustType == AppString.CustomerSummary.Comment))
    {
        t.SubCustValue = commentEnt;
        break;
    }

    _queueViewModel.SelectedCustomer = selCust;
}

您不会修改 ObservableCollection 本身(例如添加/删除项目),而是修改该集合内的项目。 ObservableCollection 负责通知其自身的更改,而不是与其项相关的更改。您应该在 SubCustValue 的设置器中 NotifyPropertyChange("SubCustValue") 。

该更改不会反映在 UI 中,因为当您 NotifyPropertyChange() 整个集合(而不是单个项目的单独属性)时,WPF 检测到它实际上是与以前相同的实例(对同一集合的相同对象引用),所以似乎什么都没有改变。

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

WPF MVVM 可观察集合不更新 GUI 的相关文章

随机推荐

  • 单击 RecyclerView 转到另一个包含 android 中数据的活动

    我正在使用 RecyclerVeiw 显示一些图像 单击它应该启动新活动 显示 RecyclerView 的 id 名称 我实现了代码 但它现在可以工作 但不可点击 下面是我的适配器 import android content Conte
  • 将 PEM 公钥读取到 iOS 中

    我有一个由 java 使用以下代码生成的 base64 公钥 RSAPublicKeySpec rsaKS new RSAPublicKeySpec modulus pubExponent RSAPublicKey rsaPubKey RS
  • java中通过POST方法发送Xml字符串

    我想通过 POST 方法将 xml 字符串传递到 URL 我尝试了下面的代码片段 但它没有返回任何内容 disableCertificateValidation String url https url https Properties s
  • 什么是“void(*old_sigint_handler)(int)”?

    这是一个语法问题 我遇到了这条线 void old sigint handler int 我不知道它在做什么 看起来像是没有变量名的三种类型的串联 我希望得到澄清 void old sigint handler int 这定义了old si
  • 线程模拟的多级使用

    我对一些很久以前编写的进行线程级模拟和进程生成的类遇到了一些问题 问题似乎是我对这些实用程序类的使用超出了其他人尝试使用它们所做的事情 第一个通过使用 OpenThreadToken 和 DuplicateToken 以及 Imperson
  • 从远程应用程序服务器连接到 Websphere Liberty jmsServer

    是否可以从远程应用程序服务器连接到部署在 Websphere Liberty 中的队列 我使用该产品的免费版本 Liberty 8 5 5 7 我在 server xml 中配置了连接工厂
  • 使用node.js和backbone.js进行模板渲染

    有没有人找到一个好的解决方案来开发可在服务器和客户端上使用的backbone js模板 这对于backbone js历史堆栈来说是非常理想的 因为用户可以在浏览器位置栏中共享和链接到真实的url 并且node js服务器可以在第一个页面视图
  • Android:旋转动画完成动画后恢复到真实状态?

    我将在 我的应用程序 中旋转图像 旋转一切正常 但是 当我旋转动画完成时 图像将返回到其先前的位置 我想要的是将图像保持在旋转状态 而不是让它回到真实状态 那么怎样才能让它成为可能呢 要旋转图像 我使用以下代码
  • 在应用程序中嵌入 C++ 编译器

    着色器不是很酷吗 您可以只输入一个纯字符串 只要它是有效的源 它就会编译 链接和执行 我想知道是否有一种方法可以将 GCC 嵌入到用户应用程序中 以便它 自给自足 例如具有编译与其自身兼容的本机二进制文件的内部功能 到目前为止 我一直在从应
  • 构建不使用 CRT 函数的 Visual C++ 应用程序仍然引用一些

    这是至少两个密切相关但又截然不同的一系列问题的一部分 我希望通过分别询问他们来做正确的事情 我正在尝试让我的 Visual C 2008 应用程序在没有 C 运行时库的情况下运行 它是一个 Win32 GUI 应用程序 没有 MFC 或其他
  • 为什么使用关键字或符号作为函数从地图中查找值有效?

    引用自Clojure 的乐趣 第 4 3 1 节 由于关键字是自我评估的并提供快速的相等性检查 因此它们几乎总是在映射键的上下文中使用 使用关键字作为映射键的一个同样重要的原因是它们可以用作函数 以映射作为参数来执行值查找 def popu
  • 理解 JS Promise

    我想更深入地了解 Promise 内部是如何工作的 因此我有一些示例代码 var p1 new Promise function resolve reject window setTimeout function resolve res c
  • 核心显卡圆形图像模糊

    我正在使用核心图形绘制圆形图像 并对其进行修改后的实现所以答案 https stackoverflow com a 18664917 1369331 这是我的来源 UIImage circularImageWithRadius CGFloa
  • Spring security 有 SimpleGrantedAuthority 但 hasRole 不起作用

    我有以下代码 private static Collection
  • 为什么 jspService() 不能被重写?

    为什么不能jspService 方法被重写 其中jspInit and jspDestroy 可以被覆盖吗 This 论坛帖子 http www geekinterview com question details 23904解释了为什么不
  • 如何使用具有 BASIC 身份验证的 Service Worker(NTLM、协商)

    我一直在尝试在 IIS 托管网站中使用服务工作线程来缓存该网站的一些静态内容 该站点是使用 Windows 身份验证的内部应用程序 我已经能够注册并运行服务工作线程 没有太多麻烦 但是一旦我打开缓存并开始向缓存添加文件 承诺就会因授权失败而
  • rspec - 为什么仅在 ubuntu 上,当它们相同时,使用 assert_equal 进行此属性比较会失败?

    两个测试都失败了 但仅在 Ubuntu 12 上失败 但在我的 新 Mac 上却失败了 失败的两个是 Active Record 对象属性比较 但我尽了最大努力来比较它们 例如在命令行创建哈希并粘贴属性 比较表明它们是相同的 这是一个真正的
  • Airflow initdb slot_pool 不存在

    我面临一个问题airflowpostgres 后端初始化 乌班图 18 04 1 气流 v1 10 6 Postgres 10 10 Python 3 6 当我跑步时 airflow initdb I get 2019 11 22 10 1
  • 在本例中如何避免 VBA 中的 select/active 语句?

    需要导出一个PDF文件中的所有工作表 所以我找到了这段代码 它有效 导出一个PDF 每张工作表一个页面 但我不想使用 select active 语句 我更喜欢使用存储对象的变量 问题 如何避免此代码中的 select ActiveShee
  • WPF MVVM 可观察集合不更新 GUI

    我正在设计一个 MVVM WPF 应用程序 并且有一个 ViewModel 它有一个名为 SelectedCustomer 的属性 类型为 Customer 该对象有一个名为 SummaryDetails 的 ObservableColle