2009-12-08 83 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