Multiconverter上的WPF相对绑定路径到Ancestor

时间:2014-08-21 16:45:08

标签: wpf xaml data-binding datagrid

我有一个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中工作?

我需要做些什么来解决这个问题?

1 个答案:

答案 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 }}"