/ / Як оновити властивість відповідно до натиснутого MenuItem? - c #, wpf, прив'язка, контекст

Як оновити властивість відповідно до натиснутого MenuItem? - c #, wpf, прив'язка, контекстне меню

Я генерую 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)

Ви знаєте, як я можу цього досягти?

Відповіді:

1 для відповіді № 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 повинні також працювати.