我根据枚举值生成一个MenuItem,我想用所点击的菜单项的内容更新一个属性。
这与ComboBox完美配合:
<ComboBox ItemsSource="{Binding Source={StaticResource TimelineUnitValues}}" SelectedItem="{Binding TimelineUnit}" />
但是由于MenuItem没有SelectedItem
属性,因此它似乎是不可能完成的任务。
生成菜单工作正常,但使用行为更新它不会做任何事情,即使行为确实收到值,它只是不更新目标属性。
<ContextMenu ItemsSource="{Binding Source={StaticResource TimelineUnitValues}}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:ChangePropertyAction Changed="Freezable_OnChanged"
PropertyName="TimelineUnit"
TargetName="UserControl1"
Value="{Binding Path=.,
Mode=OneWayToSource}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBlock>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
实际上我想不出除了使用ChangePropertyAction
之外的任何其他机制。
(我正在寻找仅限XAML的解决方案)
你知道我怎么做到这一点吗?
答案 0 :(得分:1)
您说您正在寻找仅限XAML的解决方案,但这只涉及一小部分代码。
首先,删除你的ItemTemplate并改用Style:
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding DataContext.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</ContextMenu.ItemContainerStyle>
然后在VM中添加简单命令:
this.MyCommand = new DelegateCommand<MyEnum>(val => TimelineUnit = val);
我使用DevExpress DelegateCommand对其进行了测试,但ICommand的类似实现也应该有效。