我有一个DataGrid,其中一列是int TypeID,但我将其渲染为ComboBox,并使用包含[TypeID,Name]映射的绑定值列表(TypeList)将TypeID值映射到字符串。此绑定列表在XAML中表示为
<ComboBox SelectedValue="{Binding TypeID}"
DisplayMemberPath="Name"
SelectedValuePath="TypeID"
ItemsSource="{Binding Path=DataContext.Database.TypeList, RelativeSource={RelativeSource AncestorType={x:Type Window }}}" />
这很有效。
但我想要做的是在另一列中使用Multi-type转换器将TypeID从TypeID映射为简单字符串。在我的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
作为第二个参数。从IMultiValueConverter always passes in DependencyProperty.UnsetValue for list我知道WPF系统无法找到我的绑定。
在应用程序的输出窗口中也可以看到这个错误:
System.Windows.Data警告:40:BindingExpression路径错误: &#39; DataContext的&#39;在&#39; object&#39;上找不到的属性&#39;&#39; DatabaseItem&#39; (的HashCode = 35751240)&#39 ;. BindingExpression:路径= DataContext.Database.TypeList, RelativeSource = {RelativeSource AncestorType = {x:Type Window}; 的DataItem =&#39; DatabaseItem&#39; (的HashCode = 35751240);目标元素是 &#39; TextBlock的&#39; (名称=&#39;&#39);目标属性是&#39; Text&#39; (键入&#39; String&#39;)
这就是我感到困惑的地方。我以为我的RelativeSource找到了窗口根,然后在那里寻找DataContext。相反,此错误告诉我它正在DataGrid的行项(DatabaseItem)上查找DataContext。
为什么相同的Binding表达式工作且不在同一个DataGrid中工作?
我需要做些什么来解决这个问题?
答案 0 :(得分:1)
这是因为您可能会错误输入Binding
的路径,实际上没有任何RelativeSource设置,它应该是这样的:
<Binding Path="DataContext.Database.TypeList"
RelativeSource="{RelativeSource AncestorType={x:Type Window }}"/>
和以前一样,您实际上将整个Path
设置为"DataContext.Database.TypeList, RelativeSource={RelativeSource AncestorType={x:Type Window }}"