2011-09-14 5 views
1

J'ai un projet silverlight qui gère le langage multilingue par fichiers de ressources. Maintenant, je devrais supprimer le fichier de ressources et lire les messages de la base de données. Lorsque j'utilise le fichier de ressources Je lie les contrôles comme ceci:Localisation par le dictionnaire <string, string>

<TextBlock Text="{Binding Strings.User, Source={StaticResource Localizer}}"/> 

Maintenant, j'utiliser le dictionnaire comme celui-ci:

public class Localizer : INotifyPropertyChanged 
{ 
... 
    public Dictionary<string, string> Strings 
    { 
     get { return _strings; } 
     set 
     { 
      _strings = value; 
      RaisePropertyChanged("Strings"); 
     } 
    } 
... 
} 

et lier des contrôles à ce dictionnaire comme celui-ci:

<TextBlock Text="{Binding Strings[User], Source={StaticResource Localizer}}"/> 

Il fonctionne correctement, mais je devrais changer toute liaison dans l'application et utiliser ([]) crochet au lieu de (.) dot. Y a-t-il un moyen d'empêcher ces changements?

Répondre

2

Oui, vous pouvez utiliser dériver de DynamicObject classe comme dans l'extrait suivant si vous avez Silverlight 4

class Localizer 
{ 
    public Strings Strings { get; set; } 
} 

public class Strings : DynamicObject 
{ 
    Dictionary<string, string> values; 

    public Strings(Dictionary<string, string> values) 
    { 
     this.values = values; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string value; 
     bool success = values.TryGetValue(binder.Name, out value); 
     result = value; 
     return success; 
    } 
} 
+0

tanx cher Hasan Khan, mais êtes-vous sûr que nous pouvons lier UIEelement à l'objet dynamique. J'apprécie votre exemple mais dans la sortie VS, j'obtiens System.Windows.Data Erreur: BindingExpression path error: La propriété 'User' est introuvable sur '.... Strings' '.... Strings' (HashCode = 10857028). BindingExpression: Path = 'Strings.User' DataItem = '.... Localizer' (HashCode = 30604389); L'élément cible est ... mais quand j'obtiens une propriété de Strings dans le code, pas dans xaml cela fonctionne correctement. Savez-vous ce que je fais? –

+1

Je viens de savoir c'est bug dans Silverlight http://connect.microsoft.com/VisualStudio/feedback/details/522119/databinding-to-dynamic-objects-is-broken# –

+0

Merci pour votre attention. Avez-vous une autre solution pour mon premier problème? –

Questions connexes