我有一个里面有树视图的窗口。该窗口有一个viewmodel,树视图项来自我的viewmodel。
我的树视图的上下文菜单是根据树视图上的选择动态生成的。我的viewmodel中有一个属性,树视图上的所有选定节点都正确填充。
我动态生成的contextmenuitems绑定到命令,命令参数来自我的viewmodel或我的主windows datacontext。我正在尝试在我的contextmenu itemcontainerstyle中设置命令参数绑定,但它一直在抱怨它无法找到上下文。
这是我的xaml代码,它位于我的MainWindow。
<TreeView ItemsSource="{Binding Nodes}" x:Name="treeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ContextMenu>
<ContextMenu ItemsSource="{Binding MenuItems}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Command" Value="{Binding MenuItemCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=DataContext.SelectedModels}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
现在我的viewmodel:
public class MyViewModel:NotificationObject
{
private readonly IMenuRepository _menuRepository;
public MyViewModel(IMenuRepository menuRepository)
{
_menuRepository = menuRepository;
}
private ObservableCollection<string> _nodes;
public ObservableCollection<string > Nodes
{
get { return _nodes; }
set
{
_nodes = value;
RaisePropertyChanged(() => Nodes);
}
}
private ObservableCollection<string> _selectedModels;
public ObservableCollection<string> SelectedModels
{
get { return _selectedModels; }
set
{
_selectedModels = value;
RaisePropertyChanged(() => SelectedModels);
}
}
public ObservableCollection<MyMenuItem> MenuItems
{
get {return _menuRepository.GetAll(SelectedModels); }
}
}
..和我的MenuItem视图模型
public class MyMenuItem:NotificationObject
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged(() => Name);
}
}
private DelegateCommand<IEnumerable<string>> _menuItemCommand;
public DelegateCommand<IEnumerable<string>> MenuItemCommand
{
get { return _menuItemCommand; }
set
{
_menuItemCommand = value;
RaisePropertyChanged(() => MenuItemCommand);
}
}
}
正确生成菜单项,并且命令也正确绑定。但是,该命令显示为灰色,我可以在输出窗口中看到错误:
System.Windows.Data Error: 39 : BindingExpression path error: 'DataContext' property not found on 'object' ''DeleteMenuItem' (HashCode=20916652)'. BindingExpression:Path=DataContext.SelectedModels; DataItem='DeleteMenuItem' (HashCode=20916652); target element is 'MenuItem' (Name=''); target property is 'CommandParameter' (type 'Object')
你能告诉我如何正确绑定它吗?
注意:我认为这是绑定,但即使绑定设置得当,菜单项也会显示为灰色。你能帮忙吗?该框架是.NET 3.5
谢谢, -Mike
答案 0 :(得分:0)
如果我没有误解你的问题,请试试这个
<ContextMenu ItemsSource="{Binding MenuItems}" Tag="{Binding PlacementTarget, RelativeSource={RelativeSource Mode=Self}}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Command" Value="{Binding MenuItemCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=Tag.DataContext.SelectedModels}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
由于你的其他绑定正在工作,所以不要打扰使用Tag Property。我希望这会给你一个想法。