资源中的命令未触发

时间:2014-05-09 11:55:45

标签: c# wpf mvvm

我在使用以下代码时遇到了一些问题:

 <TreeViewItem Header="Tests" ItemsSource="{Binding Tests}"  ContextMenu="{StaticResource FolderContext}" >
            <TreeViewItem.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="ContextMenu" Value="{StaticResource SolutionContext}"/>
                </Style>
            </TreeViewItem.ItemContainerStyle>
        </TreeViewItem>

上面的TreeViewItem.ItemContainerStyle定义了一个使用静态资源的上下文菜单。资源xaml是:

 <TreeView.Resources>
            <DataTemplate DataType="{x:Type viewModel:TestViewModel}">
                <Label Content="{Binding Id}"/>
            </DataTemplate>
            <ContextMenu x:Key ="SolutionContext"  StaysOpen="true">
                <MenuItem Header="Remove" Command="{Binding RemoveTest}"/>
                <MenuItem Header="Run" Command="{Binding RunTest}"/>
            </ContextMenu>
            <ContextMenu x:Key="FolderContext"  StaysOpen="true">
                <MenuItem Header="Add..." Command="{Binding AddTest}" />
            </ContextMenu>
        </TreeView.Resources>

FolderContext资源运行正常。 SolutionContext我显示corectly但是......

问题

SolutionContext命令未触发。

这是所有treeview xaml:

    <TreeView Name="TestsTreeView" SelectedItemChanged="TestsTreeView_OnSelectedItemChanged">
        <TreeView.Resources>
            <DataTemplate DataType="{x:Type viewModel:TestViewModel}">
                <Label Content="{Binding Id}"/>
            </DataTemplate>
            <ContextMenu x:Key ="SolutionContext"  StaysOpen="true">
                <MenuItem Header="Remove" Command="{Binding RemoveTest}"/>
                <MenuItem Header="Run" Command="{Binding RunTest}"/>
            </ContextMenu>
            <ContextMenu x:Key="FolderContext"  StaysOpen="true">
                <MenuItem Header="Add..." Command="{Binding AddTest}" />
            </ContextMenu>
        </TreeView.Resources>
        <TreeViewItem Header="Tests" ItemsSource="{Binding Tests}"  ContextMenu="{StaticResource FolderContext}" >
            <TreeViewItem.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="ContextMenu" Value="{StaticResource SolutionContext}"/>
                </Style>
            </TreeViewItem.ItemContainerStyle>
        </TreeViewItem>
    </TreeView>

如何触发命令?

我尝试明确指定数据上下文(viewmodel)中的命令路径,但没有工作。

以下链接是一个示例项目,其中包含用于演示问题的基本代码

https://www.sugarsync.com/pf/D6837746_80955217_310316

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据所附的来源,您将所有3个命令作为MainViewModel

的一部分
public class MainViewModel : ViewModelBase
{
    public RelayCommand RemoveTest { get; set; }
    public RelayCommand RunTest { get; set; }
    public RelayCommand AddTest { get; set; }

    ...
}

但您需要记住,每个子项目将具有不同的DataContext,然后是整个TreeView。因为您将ItemsSource绑定到List<Test>,这意味着每个子DataContext的{​​{1}}将被设置为TreeViewItem对象的不同实例,并且此类不包含{ {1}}也不是Test命令。现在你有两个选择:

  1. RemoveTestRunTest命令移至RemoveTest class
  2. 更改这两个命令的绑定源,使其指向RunTest
  3. Test