【问题标题】:WPF ListboxItem and ContextMenuWPF ListboxItem 和 ContextMenu
【发布时间】:2011-09-26 11:10:20
【问题描述】:

我有这样的代码:

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Vertical" 
                    ContextMenuService.ShowOnDisabled="True">
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Command="Delete" Click="DeleteEvent">      
                    </MenuItem>
                </ContextMenu>
            </StackPanel.ContextMenu>
                <TextBlock Text="{Binding EventName}">
            </TextBlock>        
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

不幸的是,它不起作用。我的上下文菜单被禁用(它正在显示但我无法单击它,因为它已被禁用)。我读过这个问题与选择问题有关,但我没有找到任何解决方案。你有什么想法?

【问题讨论】:

  • 为什么要同时设置MenuItem的Click事件和Command呢?您还希望为每个项目或列表显示此 ContextMenu 吗?这里是为整个列表设置的。
  • 您能否说得更具体一些或提供更多有关您的解决方案的详细信息?
  • @Ucodia :为什么要列出整个列表?看起来它是在 ListBox.ItemTemplate 中设置的?
  • 是的,对不起我的错误。我对您在 StackPanel 中布置 ItemTemplate 的事实感到不安,因为 ListBox 已经在 StackPanel 中布置了项目。我会发布一个解决方案。
  • 我想为每个 ListBoxItem 显示上下文菜单(我想用鼠标右键单击 ListBoxItem 以显示菜单,然后选择操作,例如删除 ListBoxItem)

标签: c# .net wpf xaml


【解决方案1】:

首先,奇怪的是您尝试设置 Command 和 Click 事件。您应该设置其中一个。也许该操作被禁用的事实是因为您正在设置一个值为 CanExecute = false;

您可以尝试像这样为 ListBoxItem 设置 ItemContainerStyle,而不是编写 DataTemplate:

<ListBox>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="Delete" Click="DeleteEvent"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
            <Setter Property="Content" Value="{Binding Path=EventName}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

这里我直接设置了ListBoxItem实例的ContextMenu,让它在右侧控件上显示菜单。

【讨论】:

  • 不幸的是,您的解决方案出现此错误:{“无法将类型为 'System.Windows.Controls.MenuItem' 的对象转换为类型 'System.Windows.Controls.Button'。”}跨度>
  • 那么也许您应该更准确地了解您究竟想用这个列表做什么,因为这不应该引发这种异常。
  • 我在资源中添加了上下文菜单,它正在工作:stackoverflow.com/questions/4752273/…
【解决方案2】:

ListBox 已经有一个 MenuContext。你可以试试

 <ListBox  x:Name="MyistBox">                      
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Update"/>
                <MenuItem Header="Delete"/>
            </ContextMenu>
        </ListBox.ContextMenu>
    </ListBox>

【讨论】:

    【解决方案3】:

    您只需将命令更改为标题并处理 DeleteEvent

     <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical" 
                            ContextMenuService.ShowOnDisabled="True">
                    <StackPanel.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Delete" Click="DeleteEvent">      
                            </MenuItem>
                        </ContextMenu>
                    </StackPanel.ContextMenu>
                        <TextBlock Text="{Binding EventName}">
                    </TextBlock>        
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多