TreeView ContextMenu MVVM Binding - PullRequest
       21

TreeView ContextMenu MVVM Binding

5 голосов
/ 03 января 2011

В настоящее время у меня есть UserControl, который использует модель MVVM.

В этом элементе управления есть TreeView, который отображает некоторые элементы. Я добавил HierarchicalDataTemplate для этого TreeView, и в этом шаблоне есть ContextMenu для элементов.

В ViewModel, который является DataContext элемента управления (с именем RestoresTreeViewControl), есть команда, к которой я хочу привязать один из пунктов меню. Однако то, что я сделал, похоже, не работает. Я получаю как обычно не могу найти источник для ссылки.

Вот фрагмент кода для таблицы данных, которая пыталась привязать команду EditDatabaseCommand к одному из пунктов меню.

<HierarchicalDataTemplate DataType="{x:Type model:Database}" >
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" >
                            <TextBlock.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="Edit" Command="{Binding ElementName=RestoresTreeViewControl, Path=DataContext.EditDatabaseCommand}" />
                                    <MenuItem Header="Delete"/>
                                    <Separator/>
                                    <MenuItem Header="Test Connection"/>
                                </ContextMenu>
                            </TextBlock.ContextMenu>
                        </TextBlock>
                    </StackPanel>
                </HierarchicalDataTemplate>

Вот раздел ViewModel, где находится команда.

public ICommand EditDatabaseCommand { get; private set; }

Ответы [ 3 ]

4 голосов
/ 12 июня 2013

К сожалению, ContextMenu отсутствует в VisualTree, поэтому он не увидит ваш DataContext.Что вы можете сделать, это примерно так (скопировано здесь: Команда привязки MVVM к элементу contextmenu )

<Button Height="40" Margin="0,2,0,0" CommandParameter="{Binding Name}" 
Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
      AncestorType={x:Type UserControl}}}" Command = "{Binding 
      RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},
      Path=DataContext.ConnectCommand}">
        <Button.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Remove" 
               CommandParameter="{Binding Name}"
            Command="{Binding Path=PlacementTarget.Tag.DataContext.RemoveCommand,
            RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
            </ContextMenu>
</Button.ContextMenu>

Поэтому просто используйте PlacementTarget.Tag, чтобы найти вашу ViewModel.

0 голосов
/ 14 июня 2011

Это, вероятно, связано с контекстом наследования.

См .: Связывание элемента меню ContextMenu WPF со свойством UserControl против свойства ViewModel

0 голосов
/ 03 января 2011

Вы можете попробовать отследить привязку:

 xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
 ...
 {binding ... diag:PresentationTraceSources.TraceLevel="High"}

Однако требовать от пользователей (даже если это вы сами) вашего элемента управления именовать каждый экземпляр RestoresTreeViewControl довольно обременительно.

Попробуйте:

 {Binding Path=... RelativeSource={ FindAncestor, AncestorType={x:TheRestoresTreeViewControlType}} } 
...