【问题标题】:Button ContextMenu Image only shown at last item按钮 ContextMenu 图像仅显示在最后一项
【发布时间】:2020-03-18 12:51:28
【问题描述】:

我对@9​​87654323@ 上的动态ContextMenu 有疑问。

Button 位于 DataGrid 内,在 ResourceDictionary 中具有以下列定义:

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

ContextActionItems 的ObservableCollection&lt;DisplayListActionItem&gt; 定义在一个抽象的通用基类中,该基类由多个 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 的最后一项。如果我删除最后一项,则会显示新的最后一项的图像。我不明白这是什么原因。

我已经检查了 Debug-Output 的绑定错误,但没有。

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

【问题讨论】:

  • 链接的问题没有回答这个问题
  • 如果您将 设置为一些静态图像而不是绑定会发生什么?好的?这会推断您的 Get() 有问题
  • 相同。图片总是只显示在最后一项
  • 我认为有一个叫做 x:Shared 的东西可以帮助你解决这个问题。看看this SO post
  • 列定义中已经有x:shared。我还应该在哪里设置 x:shared?

标签: c# wpf button contextmenu


【解决方案1】:

自己解决了。

解决方案是修改 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>

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多