以下示例似乎工作正常,但在输出窗口中产生了一大堆绑定错误,我如何解决它们,因为我大量使用输出窗口,并且不希望它与这些错误混杂。
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:路径=项目[2] .Colour; DataItem ='Window1'(Name =''); target元素是'SolidColorBrush'(HashCode = 47633461); target属性为'Color'(类型'Color')
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径=项[0] .Colour;的DataItem = NULL; target元素是'SolidColorBrush'(HashCode = 45523402); target属性为'Color'(类型'Color')
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径=项目[1] .Colour;的DataItem = NULL; target元素是'SolidColorBrush'(HashCode = 35287174); target属性为'Color'(类型'Color')
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径=项目[2] .Colour;的DataItem = NULL; target元素是'SolidColorBrush'(HashCode = 44419000); target属性为'Color'(类型'Color')
然后当我点击删除某个项目时,我
System.Windows.Data错误:16:无法从'Items'获取'Item []'值(类型'Item')(类型'ObservableCollection`1')。 BindingExpression:路径=项目[2] .Thickness; DataItem ='Window1'(Name =''); target元素是'Border'(Name ='b'); target属性是'BorderThickness'(类型'Thickness')TargetInvocationException:'System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---&GT; System.ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。
答案 0 :(得分:0)
看起来你无法避免这个“错误”,因为它是caused by WPF optimization。你可以做的是使用以下方法之一减少错误数量(并摆脱copypasta):
将LastItem
属性添加到Window1
。更改Items
集合时更新它。通过实施INotifyPropertyChanged
界面来通知有关更改。
创建实现LastListItemConverter
的{{1}}并返回列表的最后一项。
这两种方法都会使重复IValueConverter
不必要。