Как выполнить привязку к элементу внутри шаблона элемента управления из словаря ресурсов вне шаблона, но в том же окне?
Проблема, с которой я столкнулся, - это слишком большой файл XAML. Я хочу разделить вещи на ресурсы.
В Header
элемента MenuItem отображается без текста, и он не работает с x:Reference
а также Binding.Source
вместо того Binding.ElementName
.
Если я дам Header
свойство ниже местного значения, это работает. Мне нужно это контекстное меню, доступное в этом словаре ресурсов, потому что я использую его во многих других больших ресурсах (особенно большихDataTemplate
s в том же словаре ресурсов.
Если я поставлю это ContextMenu
, и все ресурсы, использующие его из Window.Resources
в ControlTemplate.Resources
, все работает, но я бы хотел разделить их для лучшей организации, потому что они большие.
Я искал в stackru повторяющиеся вопросы, но не нашел ничего похожего на мою ситуацию. Некоторое время я думал об этом и не нашел техники, которая могла бы мне помочь. (Я прочитал только около 80% Pro WPF 4.5.)
XAML
(кроме этого автоматически сгенерированного кода кода программной части нет)
<Window x:Class="wpf_test_1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf_test_1"
mc:Ignorable="d"
Title="MainWindow" Height="100" Width="200">
<Window.Resources>
<ContextMenu x:Key="MyContextMenu">
<MenuItem Header="{Binding ElementName=MyTextBlock,
Path=Text}"/>
</ContextMenu>
</Window.Resources>
<Grid ContextMenu="{StaticResource MyContextMenu}">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button>
A button
</Button>
<Button Grid.Row="1">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="MyTextBlock" Text="Test"/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
</Grid>
</Window>
Актуально: Контекстное меню первого /rootGrid
есть один MenuItem
это пустой Header
. Это можно проверить, щелкнув правой кнопкой мышиGrid
.
Ожидается: он должен иметьHeader
установлен на "Тест".
Скриншот
Спасибо.
Обновление 1
ContextMenu в моем реальном проекте начинается так:
<ContextMenu x:Key="MyContextMenu">
<MenuItem Click="ApplyFilters_Click"
Visibility="{Binding ElementName=MyListView,
Path=SelectedItems.Count,
Converter={StaticResource MultipleSelectedToVisibleConv}}"
Header="_Apply filters">
</MenuItem>
Обновление 2
MyContextMenu
отображается, когда пользователь щелкает правой кнопкой мыши любой элемент в MyListView
. Для MyListView у меня есть 4 комбинации DataTemplates, GridView и ItemsPanelTemplate, которые предлагают пользователю 4 способа просмотра информации. Каждый DataTemplate ссылается на MyContextMenu, поэтому он отображается, когда пользователь щелкает элемент правой кнопкой мыши.
Обновление 3
Я имел в виду "щелкнуть правой кнопкой мыши любой элемент в MyListView".
<DataTemplate x:Key="LargeIconsWithViewboxTemplate">
<Viewbox>
<Grid Tag="{Binding Path=MyFilter}"
ContextMenu="{StaticResource MyContextMenu}"
Width="84" Height="60" ToolTip="{Binding Path=DisplayString}">
[...]