ListView 未使用 ObservableCollection 正确更新

2023-11-25

我目前正在使用可观察集合来存储 ListView 的数据对象。将新对象添加到集合中效果很好,并且 listView 也可以正确更新。但是,当我尝试更改集合中对象的属性之一时,listView 将无法正确更新。例如,我有一个可观察的集合 DataCollection。我尝试

_DataCollections.ElementAt(count).Status = "Active";

我在由于按下按钮而进行长时间操作之前执行此更改。 listView 将不会反映更改。所以我添加myListView.Items.Refresh();.这是可行的,但是 listView 直到 Button_click 方法完成后才会刷新,到那时就不好了。 例如:

   button1_Click(...)
    {
      _DataCollections.ElementAt(count).Status = "Active";
      myListView.Items.Refresh();
      ExecuteLongOperation();
      _DataCollections.ElementAt(count).Status = "Finished";
      myListView.Items.Refresh();
    }

状态永远不会变为“Active”,方法完成后将直接变为“Finished”。 我也尝试过使用这样的调度程序:

button1_Click(...)
    {
      this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
            (NoArgDelegate)delegate { _DataCollection.ElementAt(count).Status =  "Active"; myListView.Items.Refresh(); });

      ExecuteLongOperation();
     this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
            (NoArgDelegate)delegate { _DataCollection.ElementAt(count).Status =  "Finished"; myListView.Items.Refresh(); });

    }

然而,这似乎也不能正常工作。任何提示或想法将不胜感激。


您必须使用正确的数据绑定技术,然后这就会自动工作。

必需的...

  1. 在 ObservableCollection 内的类上实现 INotifyPropertyChanged (并确保在该类上设置属性时触发该事件)
  2. 在 ListView 的 ItemTemplate 上,确保使用绑定到属性

如果您执行这两件事,则无需“刷新”调用或其他任何操作。设置触发 INotifyPropertyChanged 的​​属性将导致 ItemTemplate 的 Binding 更新。

在 ObservableCollection 内的类上实现 INotifyPropertyChanged...(如果您还不知道 BindableBase 类,请查找它)

public class ToDoItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get { return _name; }
        set { SetProperty(ref _name, value); }
    }

    private DateTime _date;
    public DateTime Date
    {
        get { return _date; }
        set { SetProperty(ref _date, value); }
    }

    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
    {
        if (object.Equals(storage, value)) return false;

        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged(string propertyName)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

您的列表视图

<ListView
    x:Name="listView">

    <ListView.ItemTemplate>
        <DataTemplate>

            <StackPanel>

                <TextBlock
                    Text="{Binding Name}"/>

                <TextBlock
                    Text="{Binding Date}"/>

            </StackPanel>

        </DataTemplate>
    </ListView.ItemTemplate>

</ListView>

您的可观察集合...

private ObservableCollection<ToDoItem> _toDoItems = new ObservableCollection<ToDoItem>();

// Assign the collection to the ListView
listView.ItemsSource = _toDoItems;

将东西添加到集合作品中...

_toDoItems.Add(new ToDoItem()
{
    Name = "Item " + (_toDoItems.Count + 1),
    Date = DateTime.Now
});

更新,你所要求的,有效......

ToDoItem item = _toDoItems[randomIndex];

item.Name = "Updated " + item.Name;
item.Date = DateTime.Now;

无需调用“刷新”或其他任何需要的内容。项目本身会更新,但列表不会更改。

在更新第 4 条之前...

Before updating Item 4

更新第 4 项后...

After updating Item 4

完整代码示例可在此处获取: 代码示例

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

ListView 未使用 ObservableCollection 正确更新 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • Laravel 5 动态运行迁移

    所以我创建了自己的博客包 其结构为Packages Sitemanager Blog我有一个如下所示的服务提供商 namespace Sitemanager Blog use Illuminate Support ServiceProvid
  • Firebase crashlytics 不报告崩溃

    我正在从 Fabric 升级到 Firebase crashlytics 我已将 Firebase 和 Fabric Crashlytics pod 添加到我的项目中 添加了 plist 等 除了没有报告崩溃之外 一切似乎都工作正常 我正在
  • 如何使用 Monad 的 (->) 实例以及 (->) 的困惑

    在不同的问题上 我在评论中找到了有关使用 gt Monad 的实例 例如实现无点风格 对于我来说 这有点太抽象了 好的 我已经看到了 Arrow 实例 gt 在我看来 gt 可以在实例符号中使用 但不能在类型声明中使用 这将是另一个问题的内
  • 如何从 xaml 访问 UserControl 内的按钮?

    在工作中 我有几个页面 每个页面的按钮都位于相同的位置 并且具有相同的属性 每个页面也有细微的差别 为此 我们创建了一个用户控件模板并将所有按钮放入其中 然后将该用户控件应用到所有页面 然而 现在访问按钮并从每个页面的 xaml 修改它们相
  • Google 地图问题:关闭和按引用传递

    我遇到一些 Google 地图 Javascript 问题 我想我知道问题出在哪里 但只是不知道解决方法 我的问题的一个例子是here 无论您单击什么标记 都会显示第二个标记 显然 我将错误的信息传递到我的事件监听器中 但我似乎无法获得正确
  • Qt 的 QGraphicsItem 中的事件和信号:这*应该*如何工作?

    与 Qt 中的其他图元一样 QGraphicsItems 可以处理鼠标事件等 甜的 现在假设我需要将一个 QGraphicsItem 上的事件传播到同一场景中的其他一些 QGraphicsItems 我可以想到两种方法可以解决这个问题 A
  • PHP 的 OAuth 2.0 服务器

    我一直在努力寻找一个支持 OAuth 2 0 作为服务器的活跃开源 PHP 项目 有大量的客户端示例连接到 Facebook Twitter 等 但随着越来越多的人希望通过 API 公开自己的服务 我有点惊讶开源社区尚未解决这一需求 并不是
  • wpf:如何弹出用户控件?

    背景 我有一个使用数据网格来显示数据的项目 数据网格有一个包含用户控件的 rowdetail 列 用户控件有一些文本框供用户输入和显示一些消息 问题 我想在单击按钮时弹出用户控件 并且弹出的用户控件与数据网格的 rowdetail 列中的用
  • 他们是否将 copy_if 添加到 c++0x 中?

    很烦人的是copy if不是 C 中的 有谁知道它是否会在 C 0x 中 由于C 0x还没有最终定型 所以只能看一下最新的draft
  • React-table 单个单元格样式

    我正在使用反应表 并希望根据内部的数量更改特定单元格的背景颜色 前任 单元格 gt 1 绿色 单元格 我知道这段代码不起作用 但希望它能显示我正在寻找的内容
  • 从 XAML 引用嵌套枚举类型

    我似乎无法从 XAML 引用公共嵌套枚举类型 我有课 namespace MyNamespace public class MyClass public enum MyEnum A B 我尝试参考MyEnum在 Xaml 中是这样的 xml
  • 只选择 mysql 中唯一的行/记录

    我想看看如何才能获得具有独特城市的唯一行 记录 而不关心它是否是首都 例如 Akron akron aKRON 只会返回一条记录 我厌倦了这样的事情 但它不起作用 SELECT DISTINCT city AS city state pre
  • 使用 Spring Boot、飞碟和 Thymeleaf 时图像未显示在 PDF 模板中

    我使用 Spring Boot 飞碟 thymeleaf 从 html 模板创建一个 pdf 文件 但图像没有显示在我的文件中 项目结构 代码html div class col xs 6 invoice col 2 img src sta
  • Microsoft Enterprise Library 5.0 日志记录应用程序块线程安全吗?

    我有一些代码将使用 Enterprise Library 5 0 中的日志记录应用程序块从不同的线程进行日志记录 LAB 线程安全吗 我可以像平常一样从不同的线程进行日志记录吗 还是需要同步日志记录代码 以便一次仅从一个线程使用 Enter
  • 对对象列表中的所有对象调用方法的惯用方法

    我有一个对象列表 它们有一个称为 process 的方法 在 Python 2 中可以做到这一点 map lambda x x process my object list 在 Python 3 中 这将不起作用 因为在遍历可迭代之前 ma
  • C# 检查一个图像是否存在于另一个图像中

    我不知道从哪里开始 所以一些指导会很好 我需要实现的是 检查一个大图像 例如 1280x1024 并检查其中是否存在另一个较小的图像 可能是 50x50 像素图像 我尝试通过比较每个像素来做到这一点 这非常慢 而且我可能需要执行 100 多
  • 通过jQuery为每个li元素添加不同的ID

    我是新来的 我想问一个关于 jQuery 的问题 我有无序列表 例如 ul li class something a href a li li class something a href a li li class something a
  • AtomicReference 和 Synchronized 之间有什么区别?

    AtomicReference 和 Synchronized 之间有什么区别吗 E G public class Internet AtomicReference
  • Django 2 中的自定义 LoginView

    我正在尝试在 Django 2 中自定义身份验证和视图 但问题是 如果用户已经通过身份验证 则仍会显示登录表单 并且不会重定向到适当的 URL 为了克服这个问题 我做了以下工作 class CustomLoginView LoginView
  • ListView 未使用 ObservableCollection 正确更新

    我目前正在使用可观察集合来存储 ListView 的数据对象 将新对象添加到集合中效果很好 并且 listView 也可以正确更新 但是 当我尝试更改集合中对象的属性之一时 listView 将无法正确更新 例如 我有一个可观察的集合 Da