通过 INotifyPropertyChanged 更新 ListView 的 ItemsSource

2024-04-17

回答的同时其他问题 https://stackoverflow.com/q/33553691/2681948我已经进入了一件我试图理解的事情。我有一个ListView, which 项目来源绑定到我的页面的属性。页面实现了INotifyPropertyChanged, the 数据上下文设置完毕,一切正常,我可以看到我的列表呈现在屏幕上。但是,如果我更改其中一个元素内的某些内容并引发整个集合上更改的属性,则更改在屏幕上不可见,调用 getter,因此绑定有效,但没有任何变化。

为什么会这样呢?有没有内部的列表视图的优化正在进行中吗?

XAML 代码:

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{Binding Elements}" Height="400">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" FontSize="16"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Content="Modify item" Click="Button_Click"/>
</StackPanel>

背后代码:

public class MyItem
{
    public string Name { get; set; }
    public MyItem(string name) { this.Name = name; }
}

public sealed partial class MainPage : Page, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

    private List<MyItem> elements = new List<MyItem> { new MyItem("Standard"), new MyItem("Standard"), new MyItem("Standard") };
    public List<MyItem> Elements { get { Debug.WriteLine("Collection getter"); return elements; } }

    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        elements[1].Name = "Modified one";
        RaiseProperty(nameof(Elements));
    }
}

NOTE:我知道如何通过实施来使其发挥作用InotifyPropertyChanged in MyItem班级。我还知道,当某个项目内部发生更改时重新加载整个集合是一种不好的模式。我只是想确认一些事情。


其他案例- 绑定似乎生成了源对象的引用副本,这一点很清楚。但有趣的是,当我绑定到字符串数组时:

public string[] Elements { get; } = new string[] { "Standard", "Standard", "Standard" };

private void Button_Click(object sender, RoutedEventArgs e)
{
    Elements[1] = "Modified one";
    RaiseProperty(nameof(Elements));
}

XAML中的修改:<TextBlock Text="{Binding}" FontSize="16"/>.

然后打电话RaiseProperty(nameof(Elements));更新视图,即使不修改集合。那么为什么在这种情况下绑定会以不同的方式工作呢?看起来它只是返回数组而不检查更改。


是的getter将会被呼叫,因为您正在呼叫RaiseProperty(nameof(Elements))。但没有任何内容会得到更新,因为该属性Elements is 不变。它仍然是完全相同的对象。改变的是它的底层对象(elements[1]) 的财产Name.

这就是为什么在这种情况下InotifyPropertyChanged需要在MyItem level.

如果你改变你的Elements的类型为ObservableCollection<MyItem>。然后,当您向其中添加/删除项目时,用户界面将会更新。但如果底层MyItem的属性像上面所做的那样更改,UI 仍将保持不变。

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

通过 INotifyPropertyChanged 更新 ListView 的 ItemsSource 的相关文章

  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 宏定义确定大端还是小端机?

    是否有一行宏定义来确定机器的字节顺序 我正在使用以下代码 但将其转换为宏会太长 unsigned char test endian void int test var 1 unsigned char test endian unsigned
  • 默认情况下,ASP.NET MVC 4 是否需要额外的 XSS 处理

    默认情况下 ASP NET MVC 4 会忽略帖子消息中的 HTML 输入 如果我没有明确接受 HTML 是否需要编写任何代码来保护我的网站免受 XSS 攻击 我不会使用 AllowHtml or ValidateInput false 我
  • 镜头变焦模糊变量

    我在使用时遇到困难zoom函数由下式给出Control Lens 使用我的自定义 monad 变压器HearthMonad 我不知道如何满足GHC的 模棱两可型 投诉 有问题的代码位于drawCard 我该如何解决这个问题 我是否必须创建自
  • phpmyadmin自动注销时间

    如何更改 phpmyadmin 自动注销时间 它会在 1440 秒后自动注销 这对我来说非常低 如何更改选项或完全删除登录请求 更改 php ini 将更改服务器上运行的所有网站的会话持续时间 要仅为 PhpMyAdmin 更改它 请打开c
  • 使用单独的规则定义和实例化时,Boost Spirit X3 AST 无法处理语义操作

    我尝试将 Boost Spirit X3 与语义操作结合使用 同时将结构解析为 AST 如果我使用没有单独定义和实例化的规则 它就可以正常工作 例如 include
  • Facebook 应用程序选项卡 -> 使用 PHP 进行外部链接

    我目前在 Facebook 选项卡上有一个应用程序 我想知道是否有办法让我深入链接到该应用程序选项卡上的项目 例子 用户在应用程序中 正在搜索书籍 找到一本他们喜欢的书 并想与朋友分享 他们点击分享它 我可以提取所有信息 但是我没有深层链接
  • java - JUnit 测试失败挂钩上的 Cucumber

    我们使用 Cucumber JVM 编写验收测试脚本 并使用 JUnit 来执行它们 通过 JUnit Cucumber 运行程序 由于这些测试涉及 Selenium WebDriver 因此我希望能够在测试失败时截取屏幕截图 我有代码 如
  • 如何在 Dreamweaver 中设置 PHP 测试服务器?

    我正在尝试设置一个 PHP 服务器 以便我可以使用 Dreamweaver 中的 实时 功能 此外还可以在浏览器中预览 而不必每次都通过 FTP 应用程序上传 php 文件 这效率不高当我想做快速的小预览时 我已经设置了一个新网站 并在本地
  • Javascript 字符串到 int 的转换

    我在页面中嵌入了以下 JS var round Math round var id this attr id var len id length var indexPos len 1 index of the number so that
  • 液态状态机:它是如何工作的以及如何使用它?

    我现在正在学习LSM 液态状态机 我试图了解它们到底是如何用于学习的 我对在网上读到的内容感到非常困惑 我将写出到目前为止我所理解的内容 但这可能是不正确的 所以如果您能纠正我并解释什么是正确的 我会很高兴 LSM 根本没有经过训练 它们只
  • Scala 突破地图

    当满足这样的条件时 我需要打破 seq 映射 其中foo将返回一个对象列表 其中大小取决于找到 targetId 所需的时间 def foo ids Seq String targetId String ids map id gt getO
  • Apache Ivy 如何解析 ivysettings.xml 文件中提供的工件模式中的变量?

    如果我的 ivysettings xml 文件包含
  • 使用 php 调用 __construct 内的函数

    一个简单的 PHP 问题 我找不到答案 是否可以从 construct 调用函数 例如 如果我使用 My Controller 解决方案here http davidwinter me articles 2009 02 21 authent
  • 更改 HTML5 音频标签中的控件颜色 [重复]

    这个问题在这里已经有答案了 是否可以更改 HTML5 音频标签中的 播放 暂停 和 音量 颜色 使用 Firefox 时它们的颜色非常深 使播放器看起来像是禁用的 答 不可以 目前 您无法更改 HTML5 音频标签的控件颜色 如果启用控件属
  • 一组内所有对的组合

    我想计算你可以组成一个集合的所有可能的对列表 例如 input 1 2 3 4 5 6 output 1 2 3 4 5 6 2 3 4 5 1 6 2 4 1 3 5 6 注意 这个例子只是输出中的一些随机内容 大部分都被删除了 我不关心
  • 获得正确的环面 Delaunay 三角剖分(使用 python)

    我正在尝试使用以下方法对圆环进行三角测量scipy spatial Delaunay 函数 但无法得到想要的结果 这是我的代码 from scipy spatial import Delaunay NTheta 26 NR 8 a0 1 0
  • 如何在文本框中按 Tab 键后触发事件

    我想触发一个事件 例如当我点击时显示警报消息Tab文本框中的键
  • Autofac - 解决多线程环境中的依赖关系

    public class MultithreadTester public void Run var builder new ContainerBuilder builder RegisterType
  • 钻石问题

    关于钻石问题的维基百科 钻石问题是当两个类 B 和 C 继承自 A 而类 D 继承自 B 和 C 时出现的歧义 如果 D 中的方法调用 A 中定义的方法 并且不重写该方法 并且 B 和 C 以不同的方式重写了该方法 那么它从哪个类继承 B
  • 通过 INotifyPropertyChanged 更新 ListView 的 ItemsSource

    回答的同时其他问题 https stackoverflow com q 33553691 2681948我已经进入了一件我试图理解的事情 我有一个ListView which 项目来源绑定到我的页面的属性 页面实现了INotifyPrope