2010-12-01 21 views
0

Je souhaite essayer un petit ValueConverter personnalisé dans une classe qui, après avoir été instanciée (par l'intermédiaire du constructeur par défaut, qui n'appelle que InitializeComponents()), reçoit un autre DataContext, spécifiquement une instance d'un ViewModel.Utilisation d'un ValueConverter après un commutateur DataContext

L'utilisation d'un StaticResource dans le Binding ne fonctionne pas du tout (donne un NullReferenceException), puisque le DataContext a depuis été changé (n'est pas this plus).

J'ai essayé de mettre DataContext = this; avant l'appel InitializeComponents, pas de changement. Dois-je regarder dans ce gizmo MarkupExtension (comme décrit in this article)?

J'ai également essayé de créer une instance de la coutume Value Converter dans le ViewModel (le DataContext actuel), n'aide pas non plus.

Je peux fournir des détails supplémentaires à tout moment. Merci d'avance ! J'essaie d'afficher un ContextMenu dans le TextBlock. Le ContextMenu contient un seul MenuItem. L'en-tête de MenuItem peut être "Paramètres" par exemple. Les enfants (rendus en tant que MenuItems) du dit MenuItem proviennent d'un Enum, d'où le ItemsSource sur le MenuItem.

Maintenant, tout est bien affiché, mais j'essaie de faire en sorte que l'un des enfants (par exemple un membre de l'Enum) soit sélectionné par défaut, puisqu'il y a déjà un réglage par défaut. D'autres informations d'arrière-plan peuvent être trouvées dans my other question.

Modifier:

... 
<UserControl.Resources> 
    <Helpers:DisplayTypeToDefaultValueConverter x:Key="displayTypeConverter" /> 
</UserControl.Resources> 
... 

<TextBlock x:Name="InstructionLabel" 
      TextWrapping="Wrap" Text="{Binding Path=SelectedNodeText}" 
      Grid.RowSpan="1"> 

    <TextBlock.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="Settings" Name="SettingsPop" 
       DataContext="{Binding}" 
       ItemsSource="{Binding Source={StaticResource DisplayTypeValues}}" 
       IsCheckable="True" 
       Click="SettingsType_Click"> 

     <MenuItem.ItemContainerStyle> 
      <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding}"/> 
      <Setter Property="IsChecked"> 
       <Setter.Value> 
       <Binding Converter="{StaticResource displayTypeConverter}" /> 
       </Setter.Value> 
      </Setter> 
      </Style> 
     </MenuItem.ItemContainerStyle> 

    </ContextMenu> 
    </TextBlock> 

Je n'ai maintenant réalisé que c'est la ContextMenu redoutée. C'est le problème, n'est-ce pas?

+1

1. DataContext n'a aucune influence sur la liaison StaticResource. 2. Pouvez-vous s'il vous plaît fournir la ligne de xaml où vous liez? –

+0

Venir tout de suite dans un montage. – Dr1Ku

+0

Et où est DisplayTypeValues? Impossible de voir la définition.Et le code de votre DisplayTypeToDefaultValueConverter serait également utile. –

Répondre

0

Juste quelques pensées:

  1. Êtes-vous sûr que vous ne manquez pas la mise en route de liaison dans <Binding Converter="{StaticResource displayTypeConverter}" />?
  2. Avez-vous vérifié la StackTrace de l'exception levée et toutes ses InnerExceptions à voir, s'il y avait quelque chose d'intéressant?
+0

Je pense que le chemin est manquant, devrait-il être "IsChecked"? L'exception est montrée dans un MessageBox ridicule, en plaçant le niveau de débogage «de liaison de données de WPF» plus haut des préférences de VS n'a pas aidé aussi bien. – Dr1Ku

+0

@ Dr1Ku: Si je vous comprends bien, vous pouvez appuyer sur le lien "View Detail ..." en bas de la boîte de dialogue d'exception pour voir les détails de l'exception. Je n'ai plus de pensées –

1

Le DataContext à l'intérieur du ItemContainerStyle est membre de la collection DisplayTypeValues. La seule chose dans le code XAML que vous avez publiée qui sera affectée par le DataContext de la modification de UserControl est le texte de InstructionLabel. Définir DataContext = "{Binding}" comme vous le faites sur MenuItem est également redondant car la valeur sera déjà héritée du ContextMenu parent. La question ou le code que vous attendez du DataContext ou de ce que vous essayez de faire ne ressort pas clairement de votre question ou de votre code.

+0

Ok, merci pour l'entrée, j'essaye d'obtenir un ContextMenu (disponible par clic droit) pour apparaître dans le TextBlock. Le ContextMenu se compose d'un MenuItem, le (enfant) MenuItem obtient ses valeurs d'un Enum. Ce que j'essaye de réaliser est d'avoir un élément de MenuItem (enfant) vérifié par défaut. – Dr1Ku