Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 绑定到xaml中的父对象_Wpf_Xaml_Binding_Converter - Fatal编程技术网

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上存在if
ObjectId
,而不是
子部分的属性,然后您需要绑定到
DataContext.ObjectId
谢谢您的回答。如果我的解释不够好,我很抱歉。子部分不是控件,它是控件绑定到的我的viewmodel中的一个数据结构,控件只知道一个子部分。子部分对象不引用父子部分对象吗?如果有,您可以使用类似Path=MySubPart.ParentPart.Name的东西。子部分对象没有对父子部分对象的引用吗?如果他们这样做了,您可以使用Path=MySubPart.ParentPart.Name.Excellent之类的东西。这是最终版本。这是最终版本