Привязать к родительскому объекту в xaml - PullRequest
1 голос
/ 09 января 2012

У меня есть иерархический класс, подобный этому

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 ]

4 голосов
/ 09 января 2012

Вы можете сделать то, что ищете, используя режим FindAncestor привязки RelativeSource.

Например, свойство text для TextBlock будет иметь следующий вид:

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

где local будет объявлено как пространство имен, в котором объявлен класс SubPart.

Вы можете следовать тому же шаблону для класса Part, изменяя атрибуты AncestorType и AncestorLevel по мере необходимости.

2 голосов
/ 09 января 2012

Свяжите DataContext вашего элемента управления с помощью конвертера и обновите конвертер, чтобы просто вернуть родительскую часть

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