当我点击ListBox
中的项目时,以下XAML会产生运行时绑定错误:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication1.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Window.Resources>
<x:Array x:Key="strings" Type="{x:Type sys:String}">
<sys:String>one</sys:String>
<sys:String>two</sys:String>
<sys:String>three</sys:String>
<sys:String>four</sys:String>
</x:Array>
</Window.Resources>
<Grid>
<ListBox
DataContext="{StaticResource strings}"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}"
SelectedValuePath="{Binding /Length}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Margin" Value="0,0,4,0"/>
<Setter Property="Padding" Value="0"/>
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<!-- Row 0 -->
<Label Grid.Column="0" Grid.Row="0">String:</Label>
<TextBlock
Grid.Column="1"
Grid.Row="0"
Text="{Binding}"/>
<!-- Row 1 -->
<Label Grid.Column="0" Grid.Row="1">Length:</Label>
<TextBlock
Grid.Column="1"
Grid.Row="1"
Text="{Binding Length, Mode=Default}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
这是运行时绑定错误消息:
System.Windows.Data错误:39:BindingExpression路径错误:'object'''String'上找不到'3'属性(HashCode = 1191344027)'。 BindingExpression:路径= 3; DataItem ='String'(HashCode = 1191344027); target元素是'ListBox'(Name =''); target属性是'NoTarget'(类型'Object')
我希望ListBox
的选定值为所选String
对象的长度。我的SelectedValuePath
绑定语法有什么问题? IsSynchronizedWithCurrentItem
是否存在任何相关问题?
答案 0 :(得分:4)
简短回答
替换
SelectedValuePath="{Binding /Length}"
与
SelectedValuePath="Length"
答案很长
SelectedValuePath是一个字符串,它提供从对象到所选值的路径。通过编写SelectedValuePath="{Binding /Length}"
,您将 SelectedValuePath (不是 SeletedValue )绑定到所选项目的“长度”属性,因此如果所选项目的长度为3然后 SelectedValuePath 属性的值设置为字符串“3”。然后WPF尝试通过在字符串上查找名为“3”的属性来计算 SelectedValue 。由于字符串对象没有名为“3”的属性,因此会出现错误。
你可能会认为SelectedValue={Binding /Length}"
可以做到这一点,而且它确实表达了你实际上要做的事情的概念。但它实际上并不起作用,因为Selector
的代码会在SelectedValue
更改时覆盖SelectedItem
。
另一种看待这种情况的方法是将SelecteValuePath
设置为值“abcd”实际上等同于将SelectedValue
设置为"{Binding /abcd}"
(但仅当IsSynchronizedWithCurrentItem =“true”时)。