Привязка данных MenuItem - PullRequest
       14

Привязка данных MenuItem

2 голосов
/ 01 февраля 2012

Я ломал голову над этим в течение дня или около того без удачи - я, вероятно, упускаю что-то очевидное. По сути, у меня есть контекстное меню с двумя пунктами. Один статически объявлен и привязан к команде. Другой не имеет собственной команды, но связывается с коллекцией моделей представления. Так что визуально меню должно выглядеть примерно так:

  • Удалить
  • Добавить
    • Элемент 1
    • Элемент 2

Где элементы меняются в зависимости от того, с чем связано контекстное меню. Изначально у меня было что-то вроде этого:

    <ContextMenu x:Key="itemContextMenu">
        <MenuItem Header="_Delete"
                  Command="{Binding DeleteCommand}" />
        <MenuItem Header="_Add" DataContext=""
                  ItemsSource="{Binding AvailableTypes}">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <MenuItem Header="{Binding Path=ItemType.Name}"
                              Command="{Binding Path=AddItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}"
                              CommandParameter="{Binding}" />
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </ContextMenu>

Что работает, но дает мне вложенные элементы MenuItem, с которыми сталкивались другие. Основываясь на паре потоков здесь на stackoverflow, я тогда попробовал это:

    <ContextMenu x:Key="itemContextMenu">
        <MenuItem Header="_Delete"
                  Command="{Binding DeleteCommand}" />
        <MenuItem Header="_Add" 
                  ItemsSource="{Binding AvailableTypes}">
            <MenuItem.ItemContainerStyle>
                <Style TargetType="MenuItem">                        
                    <Setter Property="Header"
                            Value="{Binding Path=ItemType.Name}" />
                    <Setter Property="Command"
                            Value="{Binding Path=AddItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}" />
                    <Setter Property="CommandParameter"
                            Value="{Binding}" />
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>
    </ContextMenu>

Однако, когда я это делаю, все мои привязки терпят неудачу с такими ошибками, как:

Ошибка пути BindingExpression: свойство 'ItemType' не найдено в 'object' '' String '

Ошибка пути BindingExpression: свойство 'AddItemCommand' не найдено в 'объекте' '' Сетка '

Для меня это говорит о том, что DataContext теряется, когда я использую ItemContainerStyle. Чего мне не хватает?

редактирование:

Я думаю, что у меня здесь было несколько красных сельдей, поэтому я еще больше упростил примеры, чтобы попытаться сузить проблему.

Работает, но по-разному:

    <ContextMenu x:Key="itemContextMenu">
        <MenuItem Header="_Delete" />
        <MenuItem Header="_Add" DataContext=""
                  ItemsSource="{Binding AvailableTypes}">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <MenuItem Header="{Binding Path=ItemType.Name}" />
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </ContextMenu>

Не работает с ошибкой BindingExpression:

    <ContextMenu x:Key="itemContextMenu">
        <MenuItem Header="_Delete" />
        <MenuItem Header="_Add" 
                  ItemsSource="{Binding AvailableTypes}">
            <MenuItem.ItemContainerStyle>
                <Style TargetType="MenuItem">                        
                    <Setter Property="Header"
                            Value="{Binding Path=ItemType.Name}" />
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>
    </ContextMenu>

1 Ответ

1 голос
/ 03 февраля 2012

Видимо, это ошибка в 3.5.Я обновил свой проект до 4.0, и теперь все работает как положено.

...