【问题标题】:How to bind a string to a dynamic resource through code in WPF如何通过WPF中的代码将字符串绑定到动态资源
【发布时间】: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


【解决方案1】:

您可以将资源引用为 DynamicResource。在后面的代码中执行此操作:

frameworkElement.SetResourceReference(dependencyProperty, resourceKey);

例如:

mySampleTextBlock.SetResourceReference(TextProperty, "Foo.Bar.Baz")

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多