如何将 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>
我有一个 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>