从itemcontainerstyle中查找commandparameter的datacontext

时间:2013-02-14 13:11:46

标签: wpf

我有一个里面有树视图的窗口。该窗口有一个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

1 个答案:

答案 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。我希望这会给你一个想法。