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 正确更新 的相关文章

随机推荐

  • 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