WPF / Silverlight应用程序有一种常见的本地化技术,它涉及.resx
生成的文件的viewmodel包装器。所有绑定都引用此包装器的同一实例的属性,因此此属性上的单个NotifyPropertyChanged
会自动刷新整个UI。
例如,这是Locale
类:
public class Locale: ViewModelBase
{
public LocalizedStrings Strings {get;} = new LocalizedStrings();
public UpdateLocale()
{
NotifyPropertyChanged(nameof(Strings));
}
}
这就是约束力:
<Application.Resources>
<ns:Locale x:Key="Locale" />
</Application.Resources>
<TextBlock Text="{Binding Source={StaticResource Locale}, Path=Strings.MyString1" />
.resx编译器生成的LocalizedStrings
的所有字段都是静态的。
这意味着您无法在C#代码中执行new Locale().Strings.MyString1
,而应使用LocalizedStrings.MyString1
代替,但在绑定中它会令人惊讶地工作。
问题是,为什么?这是正确的方式还是有更好的方法?