如何使用绑定生成的项目创建上下文菜单并直接
How to create a ContextMenu with items generated from Binding and directly
感谢@thatguy 的大力帮助,我能够动态创建菜单,所有详细信息和解释都在这里:
它工作得很好,但我的问题是在列表的末尾我需要添加一个分隔符和一个删除项。
这是我使用的代码:
<ContextMenu ItemsSource="{Binding MyTypes}" ItemContainerStyle="{StaticResource MyMenuItemStyle}">
<Separator HorizontalAlignment="Stretch" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}" />
<MenuItem>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding CmdContextMenu}" CommandParameter="DEL" />
</i:EventTrigger>
</i:Interaction.Triggers>
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
Text="" />
<TextBlock
Grid.Column="1"
Margin="{StaticResource XSmallLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="Delete" />
</Grid>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
但是当我 运行 它时,我得到一个错误:
Message=Items collection must be empty before using ItemsSource.
Source=PresentationFramework
:(
我可以在
的列表中添加删除项
public IEnumerable<string> MyTypes { get; } = new List<string>
{
"PAZ",
"APP",
"DEL"
};
但是如何添加分隔符?
我找到了解决方法:
<ContextMenu>
<MenuItem ItemsSource="{Binding MyTypes}" ItemContainerStyle="{StaticResource MyMenuItemStyle}" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}">
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
Text="" />
<TextBlock
Grid.Column="1"
Margin="{StaticResource XSmallLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="New" />
</Grid>
</MenuItem.Header>
</MenuItem>
<Separator HorizontalAlignment="Stretch" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}" />
<MenuItem>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding CmdContextMenu}" CommandParameter="DEL" />
</i:EventTrigger>
</i:Interaction.Triggers>
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
Text="" />
<TextBlock
Grid.Column="1"
Margin="{StaticResource XSmallLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="Delete" />
</Grid>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
不是我想要的,但更干净。
我为可见性创建了 2 个转换器,一个与动态菜单的多重绑定一起使用,另一个非常相似,与新项目的参数和分隔符一起使用。
现在所有动态!
感谢@thatguy 的大力帮助,我能够动态创建菜单,所有详细信息和解释都在这里:
它工作得很好,但我的问题是在列表的末尾我需要添加一个分隔符和一个删除项。 这是我使用的代码:
<ContextMenu ItemsSource="{Binding MyTypes}" ItemContainerStyle="{StaticResource MyMenuItemStyle}">
<Separator HorizontalAlignment="Stretch" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}" />
<MenuItem>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding CmdContextMenu}" CommandParameter="DEL" />
</i:EventTrigger>
</i:Interaction.Triggers>
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
Text="" />
<TextBlock
Grid.Column="1"
Margin="{StaticResource XSmallLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="Delete" />
</Grid>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
但是当我 运行 它时,我得到一个错误:
Message=Items collection must be empty before using ItemsSource. Source=PresentationFramework
:(
我可以在
的列表中添加删除项public IEnumerable<string> MyTypes { get; } = new List<string>
{
"PAZ",
"APP",
"DEL"
};
但是如何添加分隔符?
我找到了解决方法:
<ContextMenu>
<MenuItem ItemsSource="{Binding MyTypes}" ItemContainerStyle="{StaticResource MyMenuItemStyle}" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}">
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
Text="" />
<TextBlock
Grid.Column="1"
Margin="{StaticResource XSmallLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="New" />
</Grid>
</MenuItem.Header>
</MenuItem>
<Separator HorizontalAlignment="Stretch" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}" />
<MenuItem>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding CmdContextMenu}" CommandParameter="DEL" />
</i:EventTrigger>
</i:Interaction.Triggers>
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
Text="" />
<TextBlock
Grid.Column="1"
Margin="{StaticResource XSmallLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="Delete" />
</Grid>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
不是我想要的,但更干净。 我为可见性创建了 2 个转换器,一个与动态菜单的多重绑定一起使用,另一个非常相似,与新项目的参数和分隔符一起使用。 现在所有动态!