2016-07-21 6 views
0

Я не могу понять, как это сделать, и можно было бы подумать, что это будет довольно просто.Изменить заголовок MenuItem и значок на основе привязки свойств viewmodel

У меня есть MenuItem, который является частью ContextMenu. У меня есть binding для логического свойства на viewmodel. В зависимости от состояния этого свойства, я хочу, чтобы текст заголовка MenuItem изменился.

Для этого я мог бы использовать IValueConverter, но я уверен, что есть более элегантное решение с использованием DataTemplate и триггеров. Я просто не могу понять правильную разметку.

Код, который я обработал (обрезал внизу), имеет две проблемы: один из HeaderTemplate не содержит значок, так что будет в тексте MenuItems (как правило, значок появляется в левая часть - см. изображение и сравните с элементами меню «Копировать» и «Очистить»). Кроме того, нажатие на MenuItem не вызывает изменений DataTemplate (обратите внимание, что команда работает, привязка к viewmodel фактически переключает состояние true/false).

<ContextMenu> 
      <MenuItem Command="{Binding Source={x:Static cmd:Commands.PauseCommand}}" 
         CommandParameter="{Binding}"> 
       <MenuItem.HeaderTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Image x:Name="img" Source="../Icons/pause.png"/> 
          <TextBlock x:Name="txt" Text="Pause"/> 
         </StackPanel> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding IsPaused}" Value="True" > 
           <Setter Property="Image.Source" Value="../Icons/play.png" TargetName="img"/> 
           <Setter Property="Text" Value="Play" TargetName="txt"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </MenuItem.HeaderTemplate> 
      </MenuItem> 

MenuItem

+0

Если вы хотите проголосовать, просим дать вам повод. –

+0

Im не downvoter, но некоторые фрагменты могут помочь – lokusking

+0

Я предполагаю, что я ищу общий пример шаблона данных, который может выполнять запрошенную функцию (т. Е. Шаблон элемента меню, который изменяет значок и заголовок на основе свойства модели). –

ответ

2

Вы имеете в виду, как это? Не делайте вещи сложнее, чем они есть;)

<ContextMenu> 
         <MenuItem Command="{Binding Source={x:Static cmd:Commands.PauseCommand}}" 
        CommandParameter="{Binding}"> 
          <MenuItem.Style> 
           <Style TargetType="MenuItem"> 
            <Setter Property="Icon" Value="../Icons/play.png>"></Setter> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding IsPaused, Mode=OneWay}" Value="True"> 
              <Setter Property="Icon" Value="../Icons/pause.png"></Setter> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </MenuItem.Style> 
         </MenuItem> 
        </ContextMenu> 
+0

Поверьте мне, я не хочу усложнять ситуацию. :(Спасибо, работает отлично. –

 Смежные вопросы

  • Нет связанных вопросов^_^