首页 > 解决方案 > 按钮 ContextMenu 图像仅显示在最后一项

问题描述

ContextMenuButton.

在 ResourceDictionary 中具有以下 Columndefinition 的内部ButtonDataGrid

<DataGridTemplateColumn Width="16" x:Key="ShowContextMenuColumn" x:Shared="False" KeyboardNavigation.IsTabStop="False">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Style="{StaticResource ShowContextMenuButtonStyle}">
                <Button.ContextMenu>
                    <ContextMenu ItemsSource="{Binding Data.ContextActionItems, Source={StaticResource proxy}}" DisplayMemberPath="DisplayText">
                        <ContextMenu.Resources>
                            <Style TargetType="{x:Type MenuItem}">
                                <Setter Property="Icon">
                                    <Setter.Value>
                                        <Image Source="{Binding Image}"/>
                                    </Setter.Value>
                                </Setter>
                                <Setter Property="Command" Value="{Binding Command}"/>
                            </Style>
                        </ContextMenu.Resources>
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="{markup:Type DataGridCell}" BasedOn="{StaticResource BaseDataGridCellStyle}">
            <Setter Property="AutomationProperties.Name" Value="ContextMenu"/>
        </Style>
    </DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>

ObservableCollection<DisplayListActionItem>ContextActionItems 是在一个抽象的通用基类中定义的,该基类由多个 ViewModel 继承。

DisplayListActionItem-Class 看起来像:

public class DisplayListActionItem : NotifyBase
{
    public string DisplayText
    {
        get { return Get<string>(); }
        set { Set(value); }
    }

    public ICommand Command
    {
        get { return Get<ICommand>(); }
        set { Set(value); }
    }

    public ImageSource Image
    {
        get { return Get<ImageSource>(); }
        set { Set(value); }
    }
}

一切正常。唯一的问题是,图像仅显示在ContextMenu. 如果我删除最后一项,则会显示新的最后一项的图像。我不明白这是什么原因。

我已经检查了绑定错误的调试输出,但没有。

有什么想法可能导致这个问题吗?

标签: c#wpfbuttoncontextmenu

解决方案


自己解决了。

解决方案是修改 ContextMenu-ItemContainerStyle,而不是在 ContextMenu 的资源中做需要的东西。

Button 的新 xaml 如下所示:

<Button Style="{StaticResource ShowContextMenuButtonStyle}">
    <Button.ContextMenu>
        <ContextMenu ItemsSource="{Binding Data.ContextActionItems, Source={StaticResource proxy}}" >
            <ContextMenu.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Icon" Value="{Binding Image, Converter={converter:ImageSourceToImageConverter}}"/>
                    <Setter Property="Header" Value="{Binding DisplayText}"/>
                    <Setter Property="Command" Value="{Binding Command}"/>
                </Style>
            </ContextMenu.ItemContainerStyle>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

推荐阅读