【问题标题】:Why does this example produce so many binding errors?为什么这个例子会产生这么多绑定错误?
【发布时间】:2013-09-04 01:37:12
【问题描述】:

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

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);
    }
}
<Window x:Class="WpfApplication67.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ContentControl>
    <ContentControl.Template>
        <ControlTemplate>
            <Border Name="b">
                <ItemsControl ItemsSource="{Binding Items}" DisplayMemberPath="Colour"/>
            </Border>
           
            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding Items.Count}" Value="0">
                    <Setter TargetName="b" Property="BorderBrush" Value="Red"/>
                    <Setter TargetName="b" Property="BorderThickness" Value="8"/>
                </DataTrigger>

                <DataTrigger Binding="{Binding Items.Count}" Value="1">
                    <Setter TargetName="b" Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="{Binding Items[0].Colour}"/>
                        </Setter.Value>
                    </Setter>
                    <Setter TargetName="b" Property="BorderThickness" Value="{Binding Items[0].Thickness}"/>
                </DataTrigger>
                
                <DataTrigger Binding="{Binding Items.Count}" Value="2">
                    <Setter TargetName="b" Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="{Binding Items[1].Colour}"/>
                        </Setter.Value>
                    </Setter>
                    <Setter TargetName="b" Property="BorderThickness" Value="{Binding Items[1].Thickness}"/>
                </DataTrigger>
                
                <DataTrigger Binding="{Binding Items.Count}" Value="3">
                    <Setter TargetName="b" Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="{Binding Items[2].Colour}"/>
                        </Setter.Value>
                    </Setter>
                    <Setter TargetName="b" Property="BorderThickness" Value="{Binding Items[2].Thickness}"/>
                </DataTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

当我启动应用程序时,我收到以下错误

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=Items[2].Color; DataItem='Window1'(名称='');目标元素是“SolidColorBrush”(HashCode=47633461);目标属性是“颜色”(输入“颜色”)

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=Items[0].Color;数据项=空;目标元素是“SolidColorBrush”(HashCode=45523402);目标属性是“颜色”(输入“颜色”)

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=Items[1].Color;数据项=空;目标元素是“SolidColorBrush”(HashCode=35287174);目标属性是“颜色”(输入“颜色”)

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=Items[2].Color;数据项=空;目标元素是“SolidColorBrush”(HashCode=44419000);目标属性是“颜色”(输入“颜色”)

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

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

【问题讨论】:

  • 看到这个answer,可能会有帮助。

标签: wpf binding


【解决方案1】:

看起来你无法避免这个“错误”,因为它是caused by WPF optimization。您可以做的是使用以下方法之一减少错误数量(并摆脱 copypasta):

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

  2. 创建LastListItemConverter,实现IValueConverter并返回列表的最后一项。

这两种方法都不需要重复的DataTriggers。

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2011-01-27
    • 1970-01-01
    • 2021-09-18
    • 2016-11-19
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多