Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Prism在WPF应用程序中使用RESX文件_C#_Wpf_Resx - Fatal编程技术网

C# 使用Prism在WPF应用程序中使用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

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

如果已加载任何模块,则不会更新文本。首先,我尝试了一种使用
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
。我不能在更改区域性时引发事件,因为另一个模块不“知道”这个。这就是事件聚合器的作用:谢谢,这非常有用。我从加载的事件切换到事件聚合器。这对于特定模块中发生的其他事件也非常有用。