У меня есть список элементов вкладок, к которым динамически добавляются представления.Каждый раз, когда пользователь добавляет вид, создается новый элемент вкладки.Сейчас я пытаюсь привязать меню к элементам tabcontrol, чтобы пользователь мог выбрать из меню, какое представление в настоящее время является активным представлением.
Мое меню ограничено следующим образом:
<Menu Background="Transparent">
<MenuItem Style="{StaticResource TabMenuButtonStyle}" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=Items}" ItemContainerStyle="{StaticResource TabMenuItem}"></MenuItem>
</Menu>
Это прекрасно работает и дает желаемый эффект (каждый пункт меню представляет собой список всех открытых вкладок).
У меня есть следующий стиль, который связывает пункты меню со свойством IsSelected элементов вкладки:
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
Моя проблема в том, что эта привязка не работает.В сообщении об ошибке привязки указывается, что он не может найти свойство IsSelected для объекта представления.Я не хочу, чтобы он использовал специфическое представление, скорее, я хочу, чтобы он посмотрел на элемент вкладки, к которому в данный момент привязано представление.
Я попробовал следующее, но все еще получаю ошибку привязки:
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=TabItem}}}" />
, которая утверждает, что не может найти предка типа TabItem для каждого пункта меню (что имеет смыслтак как предки пункта меню не являются тем, с чем он связан.)
Есть ли какой-либо способ получить доступ к родительскому элементу элемента, который входит в качестве привязки, чтобы я мог привязать его свойства?
Обновление:
По совету Ядына я решил создать конвертер значений и вернуть элементы табуляции.
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
ItemCollection ic = (ItemCollection)value;
List<TabItem> tabItems = new List<TabItem>();
foreach (var obj in ic) {
tabItems.Add((TabItem)obj);
}
return tabItems;
}
Это делает привязку IsSelected к IsChecked для работы со статическими элементами (TabControls, у которых уже созданы элементы вкладок), но для динамически добавляемых представлений метод Convert никогда не вызывается.Похоже, что TabControl не отправляет обновление связующим элементам, что-то изменилось.Вот как MenuItem теперь подключен:
<MenuItem Style="{StaticResource TabMenuButtonStyle}" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=Items, Mode=OneWay, NotifyOnSourceUpdated=True, Converter={StaticResource TabControlItemConverter}}" ItemContainerStyle="{StaticResource TabMenuItem}"></MenuItem>