我有一个DataGrid,其中一列是int类型id,但我将其呈现为ComboBox,并使用包含[TypeID, Name]映射的绑定值列表(TypeList)将类型id值映射到字符串。这个绑定列表在XAML中表示为
<ComboBox SelectedValue="{Binding TypeID}"
DisplayMemberPath="Name"
SelectedValuePath="TypeID"
ItemsSource="{Binding Path=DataContext.Database.TypeList, RelativeSource={RelativeSource AncestorType={x:Type Window }}}" />
但是我想做的是在另一列中使用多类型转换器将从TypeID映射的Name呈现为简单字符串。在我的XAML中,在相同的数据网格中我有
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="20">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource TypeIDConverter}">
<Binding Path="TypeID" />
<Binding Path="DataContext.Database.TypeList, RelativeSource={RelativeSource AncestorType={x:Type Window }}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
这根本不起作用。
在类型转换器中,我得到第二个参数的DependencyProperty.UnsetValue
。从multivalueconverter总是传入DependencyProperty。我知道WPF系统找不到我的绑定。
在应用程序的输出窗口中也可以看到这个错误:
System.Windows。数据警告:BindingExpression路径错误:在'对象''DatabaseItem' '上找不到'DataContext'属性(HashCode = 35751240)"。= DataContext.Database.TypeList BindingExpression:路径,RelativeSource={RelativeSource祖先类型={x:类型窗口};DataItem = ' DatabaseItem ' (HashCode = 35751240);目标元素是"TextBlock"(Name = ");目标属性为"Text"(类型为"String")
这就是我困惑的地方。我认为我的RelativeSource正在寻找窗口根,然后在那里寻找DataContext。相反,这个错误告诉我,它正在寻找数据网格的行项(DatabaseItem)上的数据上下文。
为什么相同的绑定表达式在相同的DataGrid中工作而不工作?
我需要做什么来解决这个问题?
这是因为您可能输错了Binding
的路径,实际上没有任何RelativeSource集,它应该是这样的:
<Binding Path="DataContext.Database.TypeList"
RelativeSource="{RelativeSource AncestorType={x:Type Window }}"/>
和前面一样,您实际上将整个Path
设置为"DataContext.Database.TypeList, RelativeSource={RelativeSource AncestorType={x:Type Window }}"