2010-05-18 19 views
0

J'ai deux objets, Culture et Traduction, dont aucun n'est compliqué. La culture est comme un simple CultureInfo, mais avec un champ supplémentaire. Les cultures ne changeront probablement pas souvent, et il n'y en aura pas beaucoup pour commencer. Cependant, il y aura de nombreuses traductions, et chaque traduction a une propriété CultureID. Les traductions ont chacune un ID de traduction, de sorte que vous pouvez lier les traductions ensemble. Les données ressembleraient à ceci:Fournit une propriété de dépendance d'un contrôle à un convertisseur dans le contrôle?

TranslationID, CultureID, Text;
1, en, Bonjour;
1, es, Hola;
2, et, Bye;
2, es, Adios; J'essaye de construire un contrôle où je peux lier la liste de Cultures aussi bien que la liste de Traductions. Pour chaque ID de traduction, il se peut qu'il n'y ait pas de traduction pour chaque culture. Je peux donc avoir l'anglais, l'espagnol, l'allemand et le chinois comme mes cultures, mais pour "Comment allez-vous", je peux seulement avoir les traductions anglaises et allemandes.

Une liste de traductions du même traductionID sera liée au contrôle. A l'intérieur du contrôle, il n'y aura qu'un ou zéro Traductions par culture. J'ai un xaml Listbox d'éléments Expander. Chaque Expander doit avoir une Culture, avec la propriété Culture.Name comme en-tête. Le contenu de chaque Expander est un TextBox contenant la traduction de cette culture, si la traduction existe. Si ce n'est pas le cas, le TextBox est vide. Jusqu'à présent, j'ai beaucoup de travail.

En dehors du contrôle, l'une des Cultures peut être sélectionnée pour éditer les Traductions, même si la traduction d'une Culture peut être éditée à l'intérieur du contrôle. C'est bien si cela arrive. Ce que la culture d'édition actuelle devrait faire est de rendre l'Expander dans mon contrôle qui contient ce même Culture, soit le seul qui soit Expandé quand le contrôle est ouvert (le contrôle sera dans un Popup). Tous les autres Expandeurs dans la zone de liste du contrôle ne doivent pas être développés. J'ai fait une propriété de dépendance dans mon contrôle qui prend la culture d'édition en cours, appelée CurrentTranslationCulture.

C'est là que se situe mon problème. J'ai essayé d'utiliser un DataTrigger et un convertisseur personnalisé pour faire la comparaison d'une culture à CurrentTranslationCulture. Cependant, puisque le convertisseur est sa propre classe, il n'a pas accès à CurrentTranslationCulture. J'ai essayé de le transmettre en tant que ConverterParameter, mais je ne pouvais pas le lier au paramètre ConverterParamater dans la liaison du DataTrigger. Je ne sais même pas si c'est l'approche que je devrais prendre. Est-ce que quelqu'un connaît la solution à cela, ou peut-être même un meilleur? Merci d'avance.

Code: Le code ci-dessous ne fonctionne pas complètement. Si vous enlevez le ConverterParameter, cela fonctionnera, mais tous mes Expanders seront fermés. Dans le ConverterParamerter, ElementName = labelTranslationEditor, est le nom que j'ai fourni à mon contrôle pour tenter d'y accéder.

<ListBox x:Name="listTranslations" AlternationCount="2"> 
       <ListBox.ItemTemplate> 
        <DataTemplate DataType="{x:Type office:Culture}"> 
         <Expander x:Name="cultureExpander" Header="{Binding Path=Name}" IsExpanded="False"> 
          <Expander.Triggers> 

          </Expander.Triggers> 
          <TextBox x:Name="tbInsertLabelText" Style="{StaticResource popupLabelTextBox}" MinWidth="300" MaxWidth="450" 
           VerticalAlignment="Top" HorizontalAlignment="Right" SpellCheck.IsEnabled="True" TextWrapping="WrapWithOverflow" /> 
         </Expander> 

         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding Path=CultureID, Converter={StaticResource expandedConverter}, ConverterParameter={Binding ElementName=labelTranslationEditor, Path=CurrentTranslationCulture}}" Value="false"> 
           <Setter TargetName="cultureExpander" Property="IsExpanded" Value="false" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
+0

Pourquoi essayer de réinventer la mondialisation? http://msdn.microsoft.com/fr-fr/library/ms788718.aspx – Will

+0

Nous utilisons la globalisation sur les parties "statiques" de l'application, comme les menus de la barre d'outils. C'est pour nos données pilotées par base de données, qui est beaucoup plus dynamique et générique. Je ne suis pas clair sur les raisons, ce n'était pas mon appel. Malheureusement, je dois m'en occuper. – JoeSharp

Répondre

0

Dans le forum MSDN ... La solution au problème de Expander était d'utiliser un MultiBinding pour capturer à la fois la culture qui est lié à l'expansion, ainsi que la CurrentTranslationCulture. Les deux sont ensuite passés dans le convertisseur qui applique la logique appropriée.

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/2699e07e-5eff-4499-8aec-34f6e1e298a0

est ici le seul code qui a changé:

<DataTemplate.Triggers> 
          <DataTrigger Value="True"> 
           <DataTrigger.Binding> 
            <MultiBinding Converter="{StaticResource expandedConverter}"> 
             <Binding Path="CultureID" /> 
             <Binding ElementName="labelTranslationEditor" Path="CurrentTranslationCulture" /> 
            </MultiBinding> 
           </DataTrigger.Binding> 
           <Setter TargetName="cultureExpander" Property="IsExpanded" Value="True" /> 
          </DataTrigger> 
         </DataTemplate.Triggers>