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 во внутренней привязке, но это все еще не может решить свойство.
Любые мысли? Я застрял на этом...
Ответы
Ответ 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>