2009-12-08 136 views
4

我有一個多語言的silverlight應用程序,其中資源存儲在resx文件中用於不同語言,並綁定到xaml中按鈕和標籤的Content Properties。動態更改UI語言

當在silverlight頁面的構造函數中設置線程的UI文化時,每件事情都可以正常工作,但是根據用戶的選擇(通過組合框選擇) 更改界面不會更改。我需要頁面重新繪製控件並根據新線程的UI文化重新綁定到資源文件。

回答

3

我不確定你用什麼機制將你的視圖綁定到你的本地化存儲庫,但我猜測問題在於通知。

視圖只會在獲取通知事件時更新綁定中的數據。最有可能的情況是,當文化發生變化時,與您綁定的本地化數據的對象不會發送通知。

您可能會考慮將INotifyPropertyChanged添加到包含您的本地化字符串的對象。然後,向該類添加一個名爲「NotifyThatEverythingChanged」的方法。在該方法中,只需發送屬性string.Empty已更改,即告知UI更新數據上下文中的所有內容。

在我的情況,我有RESX爲我自動生成的對象稱爲MyUIStrings。它有一堆靜態字符串。我從該類派生,並添加功能來通知所有內容已更改。該UI將採取相應的行動:

public class NotifyableUIStrings : MyUIStrings, INotifyPropertyChanged 
{ 
    public void NotifyThatEverythingChanged() 
    { 
     OnPropertyChanged(string.Empty); 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     var handlers = PropertyChanged; 
     if(handlers != null) 
      handlers(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

能否請您詳細說明如何在應用程序中使用這個類。我試圖做同樣的事情,綁定不起作用,我的綁定中的內容是空的。如果我註冊了「MyUIStrings」而不是通知版本,它工作正常。這是用於Silverlight 4. – SondreB 2010-08-14 14:37:01

+1

實現NotifyThatEverythingChanged的更簡單的方法是僅執行OnPropertyChanged(null)。請參閱這裏的備註部分:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx – ArildF 2010-08-14 14:55:29

+0

@ArildF:是的。那就對了。當時不知道。 String.Empty的作品也太:) – 2010-08-18 11:46:57