klashagelqvist
klashagelqvist

Reputation: 1261

Bind to parent object in xaml

I have a hierarcial class like this

Part
  SubPart
     SubSubPart1
     SubSubPart2

I have a control that is populated by SubSubPart and in that control i want to show information about the parent SubPart and Part. I want to use normal binding in xaml to display information about parent part.

Each part has a unique ObjectId as a property, each part has multiple properties that i want to display.

The control only knows about one subsubpart.

I realize that i can write a converter

    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;
        }
    }

and apply it like this

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

But then i need to write a converter for every property of the parent parts. Any solutions out there.

Upvotes: 1

Views: 4801

Answers (2)

Bob Vale
Bob Vale

Reputation: 18474

Bind the DataContext of your control using the converter and update your converter to just return the parent part

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

Upvotes: 2

Eric Olsson
Eric Olsson

Reputation: 4913

You could do what you're looking for by using the FindAncestor mode of a RelativeSource binding.

For example the text property of a TextBlock would be the following:

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

where local would be declared to be the namespace where the class SubPart is declared.

You can follow the same pattern for the Part class, changing the AncestorType and AncestorLevel attributes as needed.

Upvotes: 4

Related Questions