【发布时间】:2015-10-30 13:05:12
【问题描述】:
我目前正在开发一个项目,我使用 Caliburn 在 View 和 ViewModel 之间进行绑定。为了能够在运行时切换语言,我有单独的资源文件,其中包含应用程序中使用的所有字符串。一些例如TextBlock 文本绑定绑定到字符串资源之一,如下所示:
SampleView.xaml
<TextBlock Text={DynamicResource Foo.Bar.Baz} .../>
Language.en-US.xaml
<system:String x:Key="Foo.Bar.Baz">Im a string</system:String>
当我将应用程序的文化更改为另一种语言时,与 Foo.Bar.Baz 的 dynamic 绑定会使字符串在运行时更新为新语言。太好了!
但是,应用程序中的某些文本属性使用 Caliburn 绑定到 ViewModel 中的字符串,如下所示:
SampleView.xaml
<TextBlock Text={Binding SampleText} .../>
SampleViewModel.cs
public string SampleText { get; set; }
SampleText 的值设置为来自 Language.en-US.xaml 的字符串资源,如下所示:
...
SampleText = Application.Current.FindResource("Foo.Bar.Baz") as string;
...
很遗憾,当我更改应用程序文化时,字符串SampleText 没有更新。
因此问题是: 如何将 SampleText 设置为 Language.en-US.xaml 中的字符串资源,当我更改应用程序文化时它会自动更新?
注意:通过this StackOverflow question 上的 cmets,我了解到可以通过这样的绑定:
SampleText = Application.Current.Resource["Foo.Bar.Baz"] as string;
但是,这对我不起作用。
【问题讨论】:
-
您的 SampleViewModel 类是否实现了 INotifyPropertyChanged?更改应用程序文化后是否再次设置 SampleText 属性(在您的代码中)?
-
是的
SampleViewModel从 Caliburn 实现Conductor<object>.Collection.OneActive,因此在更改应用程序文化后更新SampleText的一种方法是在每次更改文化时设置SampleText = Application.Current.FindResource("Foo.Bar.Baz");。但是,考虑到我的应用程序到处都有这样的 TextBlock 绑定,我发现这是一个不好的解决方案。
标签: c# wpf xaml caliburn dynamicresource