【发布时间】:2021-02-27 13:56:25
【问题描述】:
我有一个包含菜单项的上下文菜单。到目前为止,一切都很好。 在子菜单(“颜色”)中,我想要静态条目(“重置颜色”和“自定义颜色”)以及动态值。它目前看起来像这样: Contextmenu.
所以,我的问题是:
我需要做什么才能获得相同的样式:静态和动态(通过我的 CustomColorCollection)条目,并且仍然可以单独设置 Command 和 CommandParameter?
动态值绑定到
public static ObservableCollection<ContextMenuColor> ColorList { get; set; } = new ObservableCollection<ContextMenuColor>()
ContextMenuColor 是一个像这样的小类:
public class ContextMenuColor
{
public string Title { get; set; }
public string Color { get; set; }
public ContextMenuColor(string title, string color)
{
this.Title = title;
this.Color = color;
}
}
当我点击一个菜单项时,我希望它以 ContextMenuColor.Color 作为命令参数来运行我的 ICommand SetColorCommand。
这是我目前在 XAML 中的内容:
<MenuItem Header="Colors">
<MenuItem.Resources>
<CollectionViewSource x:Key="CustomColorCollection" Source="{Binding ColorList}"/>
</MenuItem.Resources>
<MenuItem.ItemsSource>
<CompositeCollection>
<MenuItem Header="Reset color" Command="{Binding SetColorCommand}" CommandParameter="#DCDCDC" UsesItemContainerTemplate="False">
<MenuItem.Icon>
<Rectangle Width="20" Height="20" Fill="#DCDCDC"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Custom color" Command="{Binding SetColorCommand}" CommandParameter="custom" UsesItemContainerTemplate="False">
<MenuItem.Icon>
<Rectangle Width="20" Height="20">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5DFF00" Offset="0"/>
<GradientStop Color="#FFC500FF" Offset="1"/>
<GradientStop Color="#FF0A7D8F" Offset="0.5"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</MenuItem.Icon>
</MenuItem>
<Separator/>
<CollectionContainer Collection="{Binding Source={StaticResource CustomColorCollection}}" />
</CompositeCollection>
</MenuItem.ItemsSource>
<MenuItem.ItemTemplate>
<DataTemplate> <!-- this should only be used for the CustomColorCollection -->
<MenuItem x:Name="MyMenuItem" Header="{Binding Title}">
<MenuItem.Icon>
<Rectangle Width="20" Height="20" Fill="{Binding Color}"/>
</MenuItem.Icon>
</MenuItem>
</DataTemplate>
</MenuItem.ItemTemplate>
<MenuItem.ItemContainerStyle> <!-- this should only be used for the CustomColorCollection -->
<Style TargetType="MenuItem">
<Setter Property="Background" Value="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<Setter Property="Command" Value="{Binding Path=DataContext.SetColorCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<Setter Property="CommandParameter" Value="{Binding Color}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
P.S.:This one 有所帮助,但与我的问题仍有一些不同,因为我无法在 DataTemplate 中为建议的 TextBlock 设置 Command 和 CommandParameter。
【问题讨论】:
标签: c# wpf xaml menu contextmenu