C# 使用Prism在WPF应用程序中使用RESX文件
我正在和WPF/Prism合作一个项目。应用程序有不同的模块,其中一个模块可以更改resx对象的区域性。这很好,加载的每个模块都将显示翻译后的文本 如果已加载任何模块,则不会更新文本。首先,我尝试了一种使用C# 使用Prism在WPF应用程序中使用RESX文件,c#,wpf,resx,C#,Wpf,Resx,我正在和WPF/Prism合作一个项目。应用程序有不同的模块,其中一个模块可以更改resx对象的区域性。这很好,加载的每个模块都将显示翻译后的文本 如果已加载任何模块,则不会更新文本。首先,我尝试了一种使用x:Static的方法,但很快意识到静态值无助于解决问题。现在,我在视图模型中实现了一个get-only属性,它返回本地化字符串 public string UserDetailsLabel => Messages.UserDetailsLabel; <TextBlock Tex
x:Static
的方法,但很快意识到静态值无助于解决问题。现在,我在视图模型中实现了一个get-only属性,它返回本地化字符串
public string UserDetailsLabel => Messages.UserDetailsLabel;
<TextBlock Text="{Binding UserDetailsLabel, Mode=OneWay, NotifyOnSourceUpdated=True}"/>
公共字符串UserDetailsLabel=>Messages.UserDetailsLabel;
但是,我不知道在哪里告诉WPF(或Prism)区域性已更改,以及更新显示的值。更改区域性的模块在消息
上设置区域性
属性(在Messages.Designer.cs
中生成)
是否有方法通知值已更改
是否有方法通知值已更改
为数据绑定的UserDetailsLabel
属性实现并引发PropertyChanged
事件
这是通知WPF源值已更改的方法
在多模块Prism应用程序中,例如,您可以使用事件聚合器来引发每个视图模型处理的事件,方法是为视图中需要刷新的所有数据绑定属性引发
PropertyChanged
事件。我通过在UserControl
xaml定义中附加Loaded
事件来解决问题。然后视图要求我的视图模型更新UI。
// 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));
}
然后,视图模型调用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));
}
//UserListView.xaml
...
//UserListView.xaml.cs
private void UserListView\u已加载(对象发送方,RoutedEventArgs e){
var dataContext=(IUserListViewModel)dataContext;
dataContext.RefreshUI();
}
//UserListViewModel.cs
public-void-RefreshUI(){
RaisePropertyChanged(名称(IUserListViewModel));
}
为什么视图会告诉视图模型要更新。应该是相反的。此外,如果在加载视图后更改区域性,则此方法将不起作用。@mm8到目前为止,此方法有效,而此模块无法更改区域性。我知道它并不完美,但只有一个模块可以更改区域性,并更新自己的视图。我知道这是应该怎么做的,但属性是get only,我从未设置UserDetailsLabel
。我不能在更改区域性时引发事件,因为另一个模块不“知道”这个。这就是事件聚合器的作用:谢谢,这非常有用。我从加载的事件切换到事件聚合器。这对于特定模块中发生的其他事件也非常有用。