1

我有以下類如何從靜態方法觸發PropertyChanged事件?

public class LanguagingBindingSource : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

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

綁定到元素XAML這樣

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

的LanguageBindingSource類及其虛擬方法的唯一目的是允許屬性通知更新綁定當一個或多個資源發生變化時。實際的綁定值由轉換器提供,通過作爲參數傳遞的名稱查找資源。有關更多背景信息,請參閱關於this answer的評論。

我的問題是,資源被包含綁定的XAML頁面外部的進程更改,我需要一個靜態方法,我可以調用該方法來觸發綁定的所有實例的屬性更改通知。我正在努力弄清楚我會如何做到這一點。所有的想法將非常感激。

回答

1

修改類,如下所示: -

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")); 
    } 
    } 
} 

現在在哪裏,你需要火了這種改變使用的任何一點: -

LanguagingBindingSource.FirePropertyChanged("languageBindingSource"); 

其中「languageBindingSource」是資源鍵,你也在使用你的綁定Source屬性。

+0

這不起作用。我收到一個語法錯誤;非靜態字段,方法或屬性'System.Windows.Application.Resources.get'需要對象引用。 另外,除非我誤解FirePropertyChanged方法需要從實現綁定的視圖中調用,並且資源需要位於應用程序的資源字典中,但情況並非如此;資源名稱是提供給從數據庫查找資源的外部庫的鍵。 – 2010-07-15 11:58:50

+0

詳細闡述該場景;我擁有的是由許多視圖(用戶控件等)組成的應用程序,它們都將使用此綁定機制。其中一個視圖是一個按鈕,點擊後可打開一個翻譯UI(在我的應用程序範圍之外的程序集中實現),用戶可在其中爲一個或多個資源提供翻譯。當這個UI關閉時(它通知我)我需要一個機制來啓動所有視圖中所有綁定的刷新。 – 2010-07-15 11:59:48

+0

我不知道哪些資源可能已經改變。 – 2010-07-15 12:02:25

相關問題