【发布时间】:2020-03-18 12:51:28
【问题描述】:
我对@987654323@ 上的动态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<DisplayListActionItem> 定义在一个抽象的通用基类中,该基类由多个 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