Как установить свойство IsChecked объекта MenuItem для потомка типа Enum через XAML? - PullRequest
2 голосов
/ 29 ноября 2010

Я связал MenuItem с Enum, используя это решение .

Enum Values ​​отображаются правильно, но я не могу установить проверенное значение по умолчанию для дочерних элементов MenuItem.

В качестве альтернативы, я бы хотел, чтобы у MenuItem был установлен один из его дочерних элементов (значения перечисления, которое я использую) по умолчанию.

Я пробовал следующий код, используя стиль и сработавший сеттер:

<ContextMenu>
  <MenuItem Header="Some Setting" Name="SomeSettingMenu" DataContext="{Binding}" 
            ItemsSource="{Binding Source={StaticResource DisplayTypeValues}}" 
            Click="SomeSettingClicked">                          

    <MenuItem.ItemContainerStyle>
      <Style TargetType="MenuItem">
        <Setter Property="MenuItem.IsCheckable" Value="True"/>

        <Style.Triggers>
          <Trigger Property="MenuItem.Header" Value="enums:AnEnum.ItemA" >
            <Setter Property="MenuItem.IsChecked" Value="True"/>
          </Trigger>
        </Style.Triggers>

      </Style>                            
    </MenuItem.ItemContainerStyle>

  </MenuItem>
</ContextMenu>

Перечисление содержит значения, такие как ItemA, я также пытался AnEnum.First или 0 в атрибуте значения триггера (как ответил здесь ), но безрезультатно.

Желательно ли было бы DataTrigger? Если так, как я могу написать это в XAML? Или я должен использовать DataTemplate в ItemTemplate для MenuItem?

Я также пытался поиграться с выделенным кодом с помощью SomeSetting.Items связанных методов, однако большинство свойств (таких как Current) доступны только для чтения.

Я знаю, что вы можете написать SomeSettingMenu.ItemsSource = Enum.GetValues(typeof(....)) в коде позади, но опять же я не знаю, как программно выбрать элемент в MenuItem.

Я также пробовал этот код, он тоже не работает:

<Style.Triggers>
  <DataTrigger Binding="{Binding Path=Header}" Value="enums:DisplayType.ItemA">
    <Setter Property="IsChecked" Value="True" />
  </DataTrigger>                 
</Style.Triggers>

enums - это пространство имен из другой сборки, которую я использую.

Любые мысли приветствуются, заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

в вашем решении рассмотрите возможность изменения

<Trigger Property="MenuItem.Header" Value="enums:AnEnum.ItemA" >

на

<Trigger Property="MenuItem.Header" Value="{x:Static enums:AnEnum.ItemA}" >

в вашем примере вы проверяете, что заголовок равен sting "enums: AnEnum.ItemA" не перечислять элемент AnEnum ItemA.

2 голосов
/ 01 декабря 2010

Вы можете сделать это. Это приведет к привязке к DataContext дочернего элемента MenuItem, который является «ItemA» для первого элемента.

<MenuItem.ItemContainerStyle> 
    <Style TargetType="MenuItem">
        <Setter Property="MenuItem.IsCheckable" Value="True"/>
        <Style.Triggers> 
            <DataTrigger Binding="{Binding}" Value="ItemA">
                <Setter Property="MenuItem.IsChecked" Value="True"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</MenuItem.ItemContainerStyle>
...