Wpf 绑定到xaml中的父对象
我有这样的等级制度Wpf 绑定到xaml中的父对象,wpf,xaml,binding,converter,Wpf,Xaml,Binding,Converter,我有这样的等级制度 Part SubPart SubSubPart1 SubSubPart2 <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=ObjectId,Converter={StaticResource partConverter}}" Margin="0,0,10,0"> </TextBlock> 我有一个由子部分填充的控件,在该控件中,我想显示有关父子部分和部分
Part
SubPart
SubSubPart1
SubSubPart2
<TextBlock Grid.Row="0" Grid.Column="1"
Text="{Binding Path=ObjectId,Converter={StaticResource partConverter}}" Margin="0,0,10,0">
</TextBlock>
我有一个由子部分填充的控件,在该控件中,我想显示有关父子部分和部分的信息。我想在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;
}
}
公共对象转换(对象值、系统类型targetType、对象参数、CultureInfo区域性)
{
if(DesignerProperties.GetIsInDesignMode(新的DependencyObject()))
{返回“设计部分”;}
其他的
{
IDataService applicationService=ServiceLocator.Current.GetInstance();
IPartItem partItem=applicationService.GetEquipmentFromComponent(value.ToString());
返回partItem.PartData.Name;
}
}
然后像这样应用它
Part
SubPart
SubSubPart1
SubSubPart2
<TextBlock Grid.Row="0" Grid.Column="1"
Text="{Binding Path=ObjectId,Converter={StaticResource partConverter}}" Margin="0,0,10,0">
</TextBlock>
但是我需要为父部件的每个属性编写一个转换器。任何解决方案。您可以使用
相对资源
绑定的FindAncestor
模式来完成所需的工作
例如,TextBlock的文本属性如下所示:
Text="{Binding Path=ObjectId, RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type local:SubPart}, AncestorLevel=1}
其中,local
将被声明为类子部分
被声明的命名空间
您可以为
部分
类遵循相同的模式,根据需要更改AncestorType
和AncestorLevel
属性。您可以使用相对资源
绑定的FindAncestor
模式来完成所需操作
例如,TextBlock的文本属性如下所示:
Text="{Binding Path=ObjectId, RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type local:SubPart}, AncestorLevel=1}
其中,local
将被声明为类子部分
被声明的命名空间
对于
零件
类,您可以遵循相同的模式,根据需要更改AncestorType
和AncestorLevel
属性。使用转换器绑定控件的DataContext,并更新转换器以仅返回父零件
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding ObjectId}" DataContext="{Binding Converter={StaticResource partConverter}}" Margin="0,0,10,0" />
使用转换器绑定控件的DataContext,并更新转换器以仅返回父部件
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding ObjectId}" DataContext="{Binding Converter={StaticResource partConverter}}" Margin="0,0,10,0" />
+1尽管如果子部分的DataContext上存在ObjectId
,而不是子部分的属性,那么您需要绑定到DataContext.ObjectId
,谢谢您的回答。如果我的解释不够好,我很抱歉。子部分不是控件,它是控件绑定到的my viewmodel中的一个数据结构,控件只知道一个子部分。+1尽管子部分的DataContext上存在ifObjectId
,而不是子部分的属性,然后您需要绑定到DataContext.ObjectId
谢谢您的回答。如果我的解释不够好,我很抱歉。子部分不是控件,它是控件绑定到的我的viewmodel中的一个数据结构,控件只知道一个子部分。子部分对象不引用父子部分对象吗?如果有,您可以使用类似Path=MySubPart.ParentPart.Name的东西。子部分对象没有对父子部分对象的引用吗?如果他们这样做了,您可以使用Path=MySubPart.ParentPart.Name.Excellent之类的东西。这是最终版本。这是最终版本