Подтвердить что ты не робот

WPF привязка к parent ItemsControl изнутри дочернего элемента данных ItemsControl

Хорошо, поэтому у меня есть фанки здесь... Мне нужно иметь возможность привязываться к родительским свойствам ItemsControl изнутри дочернего шаблона данных ItemsControl:

<ItemsControl ItemsSource="{Binding Path=MyParentCollection, UpdateSourceTrigger=PropertyChanged}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>

                <ItemsControl ItemsSource="{Binding Path=MySubCollection}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=MyParentCollection.Value, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Предположим, что MyParentCollection (внешняя коллекция) имеет следующий тип:

public class MyObject
{
    public String Value { get; set; }
    public List<MyChildObject> MySubCollection { get; set;
}

И пусть предположим, что MyChildObject из указанного класса имеет следующий тип:

public class MyChildObject
{
    public String Name { get; set; }
}

Как я могу привязать к MyParentCollection.Value из внутреннего шаблона данных? Я не могу использовать тип FindAncestor по типу, потому что оба уровня используют одинаковые типы. Я подумал, что, возможно, я могу поместить имя в внешнюю коллекцию и использовать тег ElementName во внутренней привязке, но это все еще не может решить свойство.

Любые мысли? Я застрял на этом...

4b9b3361

Ответ 1

сохранение родительского элемента в теге дочерних элементов может работать

    <DataTemplate>

            <ItemsControl ItemsSource="{Binding Path=MySubCollection}" Tag="{Binding .}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Tag.Value, RelativeSource={RelativeSource  AncestorType={x:Type ItemsControl}}}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

    </DataTemplate>

его не проверили, но дайте подсказку в правильном направлении:)

Ответ 2

Привязка для Tag, как предлагается в другом ответе, не требуется. Все данные могут быть получены из DataContext ItemControl (и эта разметка Tag="{Binding}" просто копирует DataContext в свойство Tag, которое является избыточным).

<ItemsControl ItemsSource="{Binding Path=MyParentCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Path=MySubCollection}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=DataContext.Value, RelativeSource={RelativeSource AncestorType=ItemsControl}}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>