绑定到xaml中的父对象

时间:2012-01-09 13:59:16

标签: wpf xaml binding converter

我有一个像这样的军事课

Part
  SubPart
     SubSubPart1
     SubSubPart2

我有一个由SubSubPart填充的控件,在该控件中我想显示有关父SubPart和Part的信息。我想在xaml中使用普通绑定来显示有关父部分的信息。

每个部分都有一个唯一的ObjectId作为属性,每个部分都有我想要显示的多个属性。

控件只知道一个子子部分。

我意识到我可以写一个转换器

    public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
    {

        if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))

        { return "Design Part"; }
        else
        {

            IDataService applicationService = ServiceLocator.Current.GetInstance<IDataService>();
            IPartItem partItem = applicationService.GetEquipmentFromComponent(value.ToString());

            return partItem.PartData.Name;
        }
    }

并像这样应用

<TextBlock Grid.Row="0" Grid.Column="1"
Text="{Binding Path=ObjectId,Converter={StaticResource partConverter}}" Margin="0,0,10,0">
</TextBlock>

但是我需要为父部件的每个属性编写一个转换器。那里有任何解决方案。

2 个答案:

答案 0 :(得分:4)

您可以使用FindAncestor绑定的RelativeSource模式来执行您要查找的内容。

例如,TextBlock的text属性如下:

Text="{Binding Path=ObjectId, RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type local:SubPart}, AncestorLevel=1}

其中local将被声明为声明类SubPart的命名空间。

您可以按照Part课程的相同模式,根据需要更改AncestorTypeAncestorLevel属性。

答案 1 :(得分:2)

使用转换器绑定控件的DataContext并更新转换器以返回父部件

<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding ObjectId}" DataContext="{Binding Converter={StaticResource partConverter}}" Margin="0,0,10,0" />