【问题标题】:Binding command in context menu上下文菜单中的绑定命令
【发布时间】:2016-07-01 12:18:00
【问题描述】:

我正在尝试学习如何使用上下文菜单。我得到了菜单,它看起来不错,但命令没有绑定到上下文菜单中。它们确实在上下文菜单下方的可见按钮堆栈面板中工作。我在输出中得到了这个:

System.Windows.Data 错误:4:找不到与引用“ElementName=MainGrid”进行绑定的源。 BindingExpression:Path=DataContext.StartClientCommand;数据项=空;目标元素是'MenuItem'(名称='');目标属性是“Command”(输入“ICommand”)

 <ListBox x:Name="lbSlaves" Grid.Row="1"  
             ItemsSource="{Binding Slaves}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel  />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" Width="150" >
                        <StackPanel Orientation="Horizontal">
                            <CheckBox  IsChecked="{Binding IsSelected ,Mode=TwoWay}"/>
                            <TextBlock Text="{Binding FriendlyName, Mode=OneWay}" >
                                <TextBlock.ContextMenu>
                                    <ContextMenu>
                                        <MenuItem Header="Start" 
                                                  Command="{Binding  ElementName=MainGrid, Path=DataContext.StartClientCommand}" 
                                                  CommandParameter="{Binding}" />
                                        <MenuItem Header="Stop" 
                                                  Command="{Binding  ElementName=MainGrid, Path=DataContext.StopClientCommand}" 
                                                  CommandParameter="{Binding}"  />
                                        <MenuItem Header="Calibrate" 
                                                  Command="{Binding  ElementName=MainGrid, Path=DataContext.CalibrateClientCommand}" 
                                                  CommandParameter="{Binding}" />
                                    </ContextMenu>
                                </TextBlock.ContextMenu>
                            </TextBlock>
                        </StackPanel>
                        <Button 
                        Content="Start"  
                        Command="{Binding  ElementName=MainGrid, Path=DataContext.StartClientCommand}" 
                        CommandParameter="{Binding}" />

                        <Button 
                        Content="Stop"  
                        Command="{Binding  ElementName=MainGrid, Path=DataContext.StopClientCommand}" 
                        CommandParameter="{Binding}" />

                        <Button 
                        Content="Calibrate"  
                        Command="{Binding  ElementName=MainGrid, Path=DataContext.CalibrateClientCommand}" 
                        CommandParameter="{Binding}" />

                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

【问题讨论】:

标签: c# wpf


【解决方案1】:

这有点棘手。由于 ContextMenu 不是可视化树的一部分,因此您需要以不同的方式传递数据上下文。你可以这样做:

<TextBlock Text="{Binding FriendlyName, Mode=OneWay}" Tag="{Binding Path=DataContext, ElementName=MainGrid}" >
    <TextBlock.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Start" 
                      Command="{Binding Path=PlacementTarget.Tag.StartClientCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                      CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
            <MenuItem Header="Stop" 
                      Command="{Binding  Path=PlacementTarget.Tag.StopClientCommand , RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                      CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}"  />
            <MenuItem Header="Calibrate" 
                      Command="{Binding  Path=PlacementTarget.Tag.CalibrateClientCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                      CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
        </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>

【讨论】:

    【解决方案2】:

    ContextMenu 不是可视树的一部分,因此您无法访问您的网格。

    您可以使用PlacementTarget 属性获得ContextMenu 的包含控件。

    如果您正确设计了ViewModel,那么您的DataContext 将到达您的CM。在您的情况下,您的 DataTemplate's DataContext 就足够了。如果这不是您想要的,并且您的命令像我们在NavigationCommand 类中的方式一样作为静态成员存在,那么您需要像这样分配命令:

    <MenuItem Command="{x:Static local:MyCommands.CustomCommand}" ... />
    

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2018-11-25
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多