多转换器到祖先的WPF相对绑定路径



我有一个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 }}"

最新更新