我在使用以下代码时遇到了一些问题:
<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
任何帮助都将不胜感激。
答案 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
命令。现在你有两个选择:
RemoveTest
和RunTest
命令移至RemoveTest
class RunTest
Test