如何根据ClickItem更新属性?

时间:2014-04-23 07:41:35

标签: c# wpf binding contextmenu

我根据枚举值生成一个MenuItem,我想用所点击的菜单项的内容更新一个属性。

这与ComboBox完美配合:

enter image description here

<ComboBox ItemsSource="{Binding Source={StaticResource TimelineUnitValues}}" SelectedItem="{Binding TimelineUnit}" />

但是由于MenuItem没有SelectedItem属性,因此它似乎是不可能完成的任务。

生成菜单工作正常,但使用行为更新它不会做任何事情,即使行为确实收到值,它只是不更新​​目标属性。

enter image description here

<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的解决方案)

你知道我怎么做到这一点吗?

1 个答案:

答案 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的类似实现也应该有效。