2010-11-29 22 views
2

J'ai lié un MenuItem à un Enum en utilisant this solution. Les valeurs énumérées sont affichées correctement, mais je n'arrive pas à définir une valeur vérifiée par défaut pour les éléments enfants du MenuItem.Comment définir la propriété IsChecked d'un objet de type MenuItem pour un enfant de type Enum via XAML?

Autrement dit, je voudrais que le MenuItem ait un de ses éléments enfants (les valeurs de l'énumération que j'utilise) cochée par défaut.

J'ai essayé le code suivant, en utilisant un style et un Setter déclenché:

<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> 

ENUM contient des valeurs telles que Itema, j'ai aussi essayé AnEnum.First ou 0 dans l'attribut Valeur de déclenchement (comme answered here), en vain.

Un code DataTrigger serait-il souhaitable? Si oui, comment puis-je écrire cela en XAML? Ou devrais-je utiliser un DataTemplate dans un ItemTemplate pour le MenuItem?

J'ai également essayé de bidouiller avec du code-behind avec des méthodes liées SomeSetting.Items, mais la plupart des propriétés (telles que Current) sont en lecture seule.

Je suis conscient que vous pouvez écrire SomeSettingMenu.ItemsSource = Enum.GetValues(typeof(....)) dans le code-behind, mais encore une fois je ne sais pas comment sélectionner un élément dans le MenuItem par programmation.

J'ai aussi essayé ce code, ne fonctionne pas aussi bien:

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

enums est un espace de noms à partir d'un assemblage différent j'utilise.

Toutes les pensées seraient appréciées, merci d'avance!

+0

J'ai trouvé cet article (http://neilmosafi.blogspot.com/2007/08/feb-07-using-combobox-to-select-enum.html) mais quand j'essaie de l'adapter à mon MenuItem une belle apparence est lancée. Des pensées ? – Dr1Ku

Répondre

2

dans votre solution envisager de changer

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

à

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

dans votre exemple, vous vérifiez que la tête est égale à piqûre "énumérations: AnEnum.ItemA" pas enum Membre AnEnum ItemA.

+0

Cela ressemble à de très bonnes nouvelles, je vais vérifier et vous le faire savoir, merci de votre contribution sur cette question aussi bien! – Dr1Ku

+0

Testé, fonctionne comme annoncé, merci pour votre contribution! – Dr1Ku

2

Vous pouvez le faire. Cela va se lier au DataContext de MenuItem enfant, qui est "ItemA" pour le premier élément.

<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> 
+0

Cela a fonctionné aussi, merci pour la contribution! – Dr1Ku