Как выполнить привязку к элементу внутри шаблона элемента управления из словаря ресурсов вне шаблона, но в том же окне?

Проблема, с которой я столкнулся, - это слишком большой файл XAML. Я хочу разделить вещи на ресурсы.

В Header элемента MenuItem отображается без текста, и он не работает с x:Reference а также Binding.Source вместо того Binding.ElementName.

Если я дам Headerсвойство ниже местного значения, это работает. Мне нужно это контекстное меню, доступное в этом словаре ресурсов, потому что я использую его во многих других больших ресурсах (особенно большихDataTemplates в том же словаре ресурсов.

Если я поставлю это 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}">
[...]

0 ответов

Другие вопросы по тегам