Я генерую 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 повинні також працювати.