如何将 ICommand 绑定到运行时构建的 MenuItem

How to Bind ICommand to a runtime built MenuItem

我有一个 MenuItemViewModel 集合,它绑定到 MenuItem 的 ItemsSource。

我想将 ICommand 绑定到通过此绑定创建的 MenuItem 对象。

问题是实际的 MenuItem 控件只在运行时添加,因为我绑定到它们的视图模型。

This is the GUI我现在有。

MenuItemViewModel.vb,包含要绑定的命令(所有这些成员都有相应的 public 属性):

    Private _text As String
    Private _menuItems As IList(Of MenuItemViewModel)
    Private _commandMenuItem As RelayCommand

这是我的 NotifTilesViewModel:

Private _comPortMenuItems As ObservableCollection(Of MenuItemViewModel)
Public ReadOnly Property ComPortItems As ObservableCollection(Of MenuItemViewModel)
    Get
        Return _comPortMenuItems
    End Get
End Property

所以,这个 ViewModel 就是我绑定到您在附图中看到的通知磁贴 UserControl 的那个。

这是我的 UserControl 的相关部分 XAML:

<Button.ContextMenu>
    <ContextMenu x:Name="notifTileContextMenu">
        <MenuItem Name="***" Command="{Binding Path=***}" Header="{Resx ResxName=***, Key=***}"/>
        <MenuItem Name="***" Header="{Resx ResxName=***, Key=***}"/>
        <Separator/>
        <MenuItem Name="mItemOpenPort" Header="{Resx ResxName=***, Key=***}" ItemsSource="{Binding Path=ComPortItems}"/>                                
    </ContextMenu>
</Button.ContextMenu>

如您所见,我将 ItemsSource 属性 绑定到 MenuItemsViewModel 的 ObservableCollection。

但是我怎样才能将每个对应的 MenuItem 控件绑定到我为 _commandMenuItem 设置的 public 属性?

我没有 Visual Studio 可用,但我认为您可以通过在 MenuItem 中使用带有绑定 ItemsSource 的样式来凑合。

类似这样的事情(可能不是 100% 正确,但它应该能让你明白):

<Button.ContextMenu>
    <ContextMenu x:Name="notifTileContextMenu">
        <MenuItem Name="***" Command="{Binding Path=***}" Header="{Resx ResxName=***, Key=***}"/>
        <MenuItem Name="***" Header="{Resx ResxName=***, Key=***}"/>
        <Separator/>
        <MenuItem Name="mItemOpenPort" Header="{Resx ResxName=***, Key=***}" ItemsSource="{Binding Path=ComPortItems}">
            <MenuItem.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding FileOpenCommand}" />
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>
    </ContextMenu>
</Button.ContextMenu>