Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF ListboxItem和ContextMenu_C#_.net_Wpf_Xaml - Fatal编程技术网

C# WPF ListboxItem和ContextMenu

C# WPF ListboxItem和ContextMenu,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有这样的代码: <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical" ContextMenuService.ShowOnDisabled="True"> <StackPanel.ContextMenu> <ContextMenu&

我有这样的代码:

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


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

首先,奇怪的是,您试图设置命令和单击事件。你应该设置一个或另一个。该操作被禁用可能是因为您正在设置一个值为CanExecute=false的命令

您可以尝试为ListBoxItem设置ItemContainerStyle,而不是编写DataTemplate,如下所示:

<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>
<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,这样它将在右侧控件上显示菜单。

您只需将命令更改为header并处理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>

列表框已具有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>


为什么要同时设置单击事件和菜单项的命令?您还希望为每个项目或列表显示此上下文菜单吗?这里是为整个列表设置的。您能更具体一点或给我更多关于您的解决方案的详细信息吗?@Ucodia:为什么要为整个列表设置?看起来它是在列表框内设置的。ItemTemplate?是的,对不起,我弄错了。我对您在StackPanel中布置ItemTemplate感到不安,因为ListBox已经在StackPanel中布置了项目。我将发布一个解决方案。我想为每个ListBoxItem显示上下文菜单(我想用鼠标右键单击ListBoxItem以显示菜单,然后选择操作,例如删除ListBoxItem),不幸的是,我在您的解决方案中遇到了此错误:{“无法将'System.Windows.Controls.MenuItem'类型的对象强制转换为'System.Windows.Controls.Button'。}那么也许您应该更准确地说明您正试图使用此列表执行的操作,因为这不应引发此类异常。我在参考资料中添加了上下文菜单,它正在工作: