2012-01-09 106 views
1

父对象我有一个hierarcial类这样绑定到在XAML

Part 
    SubPart 
    SubSubPart1 
    SubSubPart2 

我有一个由SubSubPart并且在控制我想显示对父母分部和部分信息填充控制。我想在xaml中使用普通绑定来显示关于父部件的信息。

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

控件只知道一个sububpart。

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

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> 

但后来我需要写一个转换器,用于父件的每个属性。任何解决方案。

+0

不要SubSubPart对象有父分部对象的引用控件的DataContext的?如果他们这样做,你可以使用像Path = MySubPart.ParentPart.Name。 – 2012-01-09 14:32:17

回答

2

绑定使用转换器和更新您的转换器只返回父零件

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

优秀。这是最终版本 klashagelqvist 2012-01-09 14:43:24

4

您可以通过使用RelativeSource绑定的FindAncestor模式来执行要查找的操作。

例如TextBlock的Text属性将是以下几点:

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

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

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

+4

+1虽然如果在SubPart的DataContext上存在ObjectId而不是SubPart上的属性,那么您需要绑定到DataContext.ObjectId – Rachel 2012-01-09 14:14:04

+0

感谢您的回答。对不起,如果我的解释不够好。子部件不控制其视图模型内部的数据结构,该控件绑定到控件并且控件只知道一个子部件。 – klashagelqvist 2012-01-09 14:17:55