将ObservableCollection绑定到ItemsControl——不像听起来那么简单

本文关键字:听起来 简单 绑定 ItemsControl ObservableCollection | 更新日期: 2023-09-27 18:15:08

这很难追踪,给我带来了很大的痛苦-但似乎ItemsControls的行为方式不像我期望的那样。这似乎是WPF的一个bug,但作为WPF的新手,我犯的错误是我的错,不是他们的错。

复制它非常简单——将一个ItemsControl绑定到一个ObservableCollection,然后替换集合中的一个项目。这太简单了,我简直不敢相信谷歌没有发现成千上万的人有同样的问题。

下面的代码只是将ItemsControl绑定到BrushObservableCollection。更改画笔(通过单击按钮),您会得到一些数据错误,因为矩形的画笔绑定暂时属于DataContextItemsControl(!),而不是新项。这种绑定的瞬间崩溃导致我的应用程序在调试器中运行时需要超过半秒的时间来更新,每当我替换集合中的(不可变的、常规的CLR对象)项时—我做错了什么?

<Window x:Class="Dummy.Test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Test" Height="300" Width="300">
    <Grid>
        <ItemsControl ItemsSource="{Binding Foos}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type Brush}">
                    <Rectangle Width="20" Height="20" Fill="{Binding}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        <Button HorizontalAlignment="Center" VerticalAlignment="Bottom" Click="SwitchClick">Switch</Button>
    </Grid>
</Window>
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Media;
namespace Dummy
{
    public partial class Test : Window
    {
        private readonly ObservableCollection<Brush> foos = new ObservableCollection<Brush>();
        public ObservableCollection<Brush> Foos { get { return foos; } }
        public Test()
        {
            InitializeComponent();
            Foos.Add(Brushes.Green);
            DataContext = this;
        }
        private void SwitchClick(object sender, EventArgs e)
        {
            Foos[0] = Foos[0] == Brushes.Green ? Brushes.Silver : Brushes.Green;
        }
    }
}

将ObservableCollection绑定到ItemsControl——不像听起来那么简单

在我使用。net 4.0的设备上尝试过之后,我认为这是。net 3.5的问题。如果你的客户坚持在。net 3.5版本中使用它,建议他们升级到。net 4.0,这个问题就会解决。谢谢:)