使用 Prism 在 WPF 应用程序中使用 RESX 文件

Use RESX file in WPF application with Prism

我正在与 WPF/Prism 合作一个项目。该应用程序具有不同的模块,其中一个模块可以更改 resx 对象的区域性。这工作正常,每个加载的模块都会显示翻译后的文本。

如果已经加载了任何模块,则不会更新文本。首先,我尝试了 x:Static 的方法,但很快意识到静态值对我的问题没有帮助。现在我在我的视图模型中实现了一个只获取 属性,returns 本地化字符串。

public string UserDetailsLabel => Messages.UserDetailsLabel;

<TextBlock Text="{Binding UserDetailsLabel, Mode=OneWay, NotifyOnSourceUpdated=True}"/>

但是,我不知道在哪里告诉 WPF(或 Prism)文化已经改变并更新显示的值。更改文化的模块在 Messages 上设置 Culture 属性(在 Messages.Designer.cs 中生成)。

有没有办法通知值已更改?

Is there a way to notify that the value changed?

实施 INotifyPropertyChanged 并为数据绑定 UserDetailsLabel 属性.

引发 PropertyChanged 事件

这是通知 WPF 源值已更改的方式。

在多模块 Prism 应用程序的上下文中,例如,您可以使用事件聚合器来引发每个视图模型处理的事件,方法是为需要的所有数据绑定属性引发 PropertyChanged 事件将在视图中刷新。

我通过在 UserControl xaml 定义中附加 Loaded 事件解决了我的问题。然后视图要求我的视图模型更新 UI。 然后视图模型调用 RaisePropertyChanged(nameof(UserDetailsLabel)) 并更新视图。

// UserListView.xaml
<UserControl ... Loaded="UserListView_OnLoaded">...</UserControl>


// UserListView.xaml.cs
private void UserListView_OnLoaded(object sender, RoutedEventArgs e) {
  var dataContext = (IUserListViewModel) DataContext;
  dataContext.RefreshUI();
}


// UserListViewModel.cs
public void RefreshUI() {
  RaisePropertyChanged(nameof(IUserListViewModel));
}