1

J'ai la classe suivanteComment puis-je déclencher l'événement PropertyChanged à partir de la méthode statique?

public class LanguagingBindingSource : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Dummy 
    { 
    get { return String.Empty; } 
    set 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs("Dummy")); 
    } 
    } 
} 

qui est lié à des éléments XAML comme celui-ci

Text="{Binding Dummy,Source={StaticResource languageSource},Converter={StaticResource languageConverter},ConverterParameter=labelColor}" 

Le seul but de la classe LanguageBindingSource et sa méthode factice est de permettre des notifications de propriété de mettre à jour les liaisons quand une ou plusieurs ressources changent. Les valeurs liées réelles sont fournies par le convertisseur, recherchant des ressources par les noms passés en tant que paramètres. Voir les commentaires sur this answer pour plus d'arrière-plan. Mon problème est que les ressources sont modifiées par un processus externe aux pages XAML contenant les liaisons et j'ai besoin d'une seule méthode statique que je peux appeler pour déclencher une notification de changement de propriété pour toutes les instances de la liaison. J'ai du mal à comprendre comment je pourrais faire ça. Toutes les idées seront très appréciées.

Répondre

1

Modifier votre classe comme suit: -

public class LanguagingBindingSource : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate {}; 

    public static void FirePropertyChanged(string key) 
    { 
    ((LanguagingBindingSource)Application.Resources[key]).NotifyPropertyChanged("Dummy"); 
    } 

    private void NotifyPropertyChanged(string name) 
    { 
    PropertyChanged(this, new PropertyChangedEventArgs(name); 
    } 

    public string Dummy 
    { 
    get { return String.Empty; } 
    set 
    { 
     NotifyPropertyChanged("Dummy")); 
    } 
    } 
} 

maintenant sont tout point où vous devez tirer de cette utilisation du changement: -

LanguagingBindingSource.FirePropertyChanged("languageBindingSource"); 

Où « languageBindingSource » est la clé de ressource que vous utilisent également dans votre propriété de liaison Source.

+0

Cela ne fonctionne pas. Je reçois une erreur de syntaxe; Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique 'System.Windows.Application.Resources.get'. De plus, à moins que je ne comprenne mal la méthode FirePropertyChanged, il faudrait l'appeler depuis la vue qui implémente les liaisons et les ressources devraient être dans le dictionnaire de ressources de l'application, ce qui n'est pas le cas; les noms de ressources sont des clés fournies à une bibliothèque externe qui recherche les ressources d'une base de données. –

+0

Pour élaborer un peu plus sur le scénario; Ce que j'ai est une application composée de plusieurs vues (contrôles utilisateur, etc.) qui utiliseront tous ce mécanisme de liaison. Dans l'une de ces vues se trouve un bouton qui, lorsqu'on clique dessus, ouvre une interface utilisateur de traduction (implémentée dans un assembly en dehors de mon application) dans laquelle l'utilisateur peut fournir des traductions pour une ou plusieurs ressources. C'est quand cette interface se ferme (cela m'avertit) que j'ai besoin d'un mécanisme pour déclencher un rafraîchissement de toutes les liaisons à travers toutes les vues. –

+0

Je n'aurai aucune idée de laquelle des ressources peut avoir changé. –

Questions connexes