Wpf 为什么这个例子会产生这么多绑定错误?

Wpf 为什么这个例子会产生这么多绑定错误?,wpf,binding,Wpf,Binding,下面的示例似乎工作正常,但在输出窗口中产生了一大堆绑定错误,我如何解决这些错误,因为我大量使用输出窗口,不希望它被这些错误弄乱 public partial class Window1 : Window { public class Item { public Color Colour { get; set; } public double Thickness { get; set; } } public ObservableCo

下面的示例似乎工作正常,但在输出窗口中产生了一大堆绑定错误,我如何解决这些错误,因为我大量使用输出窗口,不希望它被这些错误弄乱

public partial class Window1 : Window
{
    public class Item
    {
        public Color Colour { get; set; }
        public double Thickness { get; set; }
    }

    public ObservableCollection<Item> Items { get; private set; }

    public Window1()
    {
        Items = new ObservableCollection<Item>();
        Items.Add(new Item() { Colour = Colors.Red, Thickness = 1 });
        Items.Add(new Item() { Colour = Colors.Green, Thickness = 2 });
        Items.Add(new Item() { Colour = Colors.Blue, Thickness = 3 });

        DataContext = this;
        InitializeComponent();
    }

    protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e)
    {
        base.OnPreviewMouseDoubleClick(e);

        if(Items.Count > 0)
            Items.RemoveAt(Items.Count-1);
    }
}
公共部分类窗口1:窗口
{
公共类项目
{
公共颜色{get;set;}
公共双厚度{get;set;}
}
公共可观测集合项{get;private set;}
公共窗口1()
{
Items=新的ObservableCollection();
添加(新项(){color=Colors.Red,厚度=1});
添加(新项(){color=Colors.Green,厚度=2});
添加(新项(){color=Colors.Blue,厚度=3});
DataContext=this;
初始化组件();
}
PreviewMouseDoubleClick上受保护的覆盖无效(鼠标按钮Ventargs e)
{
基于预览鼠标双击(e);
如果(Items.Count>0)
Items.RemoveAt(Items.Count-1);
}
}

当我启动应用程序时,会出现以下错误

System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:路径=项[2]。颜色;DataItem='Window1'(名称='');目标元素是“SolidColorBrush”(HashCode=47633461);目标属性为“颜色”(类型为“颜色”)

System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:路径=项[0]。颜色;DataItem=null;目标元素是“SolidColorBrush”(HashCode=45523402);目标属性为“颜色”(类型为“颜色”)

System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:路径=项[1]。颜色;DataItem=null;目标元素是“SolidColorBrush”(HashCode=35287174);目标属性为“颜色”(类型为“颜色”)

System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:路径=项[2]。颜色;DataItem=null;目标元素是“SolidColorBrush”(HashCode=44419000);目标属性为“颜色”(类型为“颜色”)

然后当我点击删除一个项目时,我得到

System.Windows.Data错误:16:无法从“Items”(类型“ObservableCollection”“1”)获取“Item[]”值(类型“Item”)。BindingExpression:Path=Items[2]。厚度;DataItem='Window1'(名称='');目标元素是“Border”(Name='b');目标属性为“BorderThickness”(类型为“Thickness”)TargetInvocationException:“System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小


看起来你无法避免这个“错误”。您可以使用以下方法之一减少错误数量(并消除CopyIta):

  • LastItem
    属性添加到
    Window1
    。当
    项目
    集合更改时更新它。通过实现
    INotifyPropertyChanged
    接口通知更改

  • 创建
    LastListItemConverter
    ,它实现
    IValueConverter
    ,并返回列表的最后一项

  • 这两种方法都会使重复的
    DataTrigger
    s变得不必要。

    参见此,可能会有所帮助。