【问题标题】:WPF Update binding properties of multiple items contained in a list at the same timeWPF同时更新列表中包含的多个项目的绑定属性
【发布时间】:2010-11-29 15:16:01
【问题描述】:

我将对象列表绑定到包含 TextBox 控件的 ItemsControl。

我希望能够根据绑定对象的背景颜色属性更改文本框背景颜色。

它与 INotifyPropertyChanged 界面完美配合,但是当我需要更新 1000 个对象时,我猜它需要大量时间,因为它需要一个一个地更新控件。

是否有人给我提示,让我说,更新我所有的对象背景颜色,而不是一次更新绑定而不是逐个对象?

谢谢,

垫子

【问题讨论】:

  • 您是使用“BackgroundColor”属性名称还是使用 null 触发 PropertyChanged 事件?
  • 一般来说,您应该使用 ItemTemplate 根据其中的属性设置项目的背景颜色,而不是将颜色显式地作为您绑定到的对象中的颜色。另请注意,使用从 VirtualizingStackPanel 派生的控件(例如 ListBox)而不是 ItemsControl 可以免费获得 UI 虚拟化(除非用户可以看到它们,否则它不会更新所有 UI 对象)
  • 我正在使用属性名称“BackgroundColor”触发 PropertyChanged 事件

标签: wpf list binding properties


【解决方案1】:

如果您使用虚拟化,它只需要更新可见的项目 - 通常项目控件只会跟踪当前可见项目的属性更改。但是,如果您使用基础ItemsControl,虚拟化将默认关闭。要打开它,您需要提供一个包含ScrollViewer 的自定义模板,其中CanContentScroll 设置为True,您还需要在控制模板中或通过@987654326 使用VirtualizingStackPanel @ - 这显示了前一种方法:

<ItemsControl ItemsSource="...whatever...">
  <ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl">
      <ScrollViewer CanContentScroll="True">
        <VirtualizingStackPanel IsItemsHost="True" />
      </ScrollViewer>
    </ControlTemplate>
  </ItemsControl.Template>
</ItemsControl>

虚拟化以各种方式提高了大量列表项的性能。它应该有助于您的方案,但它也可能会提高性能的其他方面。它并非没有问题,但我肯定会先在这里尝试,然后再尝试其他解决方案。

【讨论】:

    【解决方案2】:

    我终于找到了为什么要花这么长时间来更新我的 UI。顺便说一句,我想要实现的是一种电子表格网格。我的单元格容器是一个边界可见的边界。我正在根据单元格选择更新边框控件背景颜色。禁用边界控制的边界立即解决了我的问题。 UI 更新时间从 4-5 秒变为瞬时。

    谢谢你们的回答,我仍然会尝试实施您的建议,以进一步改进我的项目。

    谢谢

    垫子

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2017-01-02
      • 2013-06-17
      • 1970-01-01
      • 2010-11-01
      • 2017-07-30
      • 2021-08-21
      相关资源
      最近更新 更多