0

我有一个窗口,里面有一个树视图。窗口有一个视图模型,树视图项目来自我的视图模型。

我的树视图有一个上下文菜单,它是根据树视图上的选择动态生成的。我的视图模型中有一个属性,树视图上的所有选定节点都正确填充。

我动态生成的 contextmenuitems 绑定到一个命令,命令参数来自我的视图模型或我的主窗口数据上下文。我正在尝试在我的 contextmenu itemcontainerstyle 中设置命令参数绑定,但它一直抱怨它无法找到上下文。

这是位于我的 MainWindow 中的我的 xaml 代码。

<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>

现在我的视图模型:

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

谢谢,-迈克

4

1 回答 1

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>

由于您的其他绑定正在工作,所以不要打扰使用标签属性。我希望这会给您一个想法。

于 2013-02-14T13:33:38.063 回答