【问题标题】:Use RESX file in WPF application with Prism使用 Prism 在 WPF 应用程序中使用 RESX 文件
【发布时间】:2020-12-15 13:14:32
【问题描述】:

我正在使用 WPF/Prism 开展一个项目。该应用程序具有不同的模块,其中一个模块可以改变 resx 对象的文化。这很好用,加载的每个模块都会显示翻译后的文本。

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

public string UserDetailsLabel => Messages.UserDetailsLabel;

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

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

有没有办法通知值发生了变化?

【问题讨论】:

    标签: c# wpf resx


    【解决方案1】:

    有没有办法通知值发生了变化?

    实现INotifyPropertyChanged 并为数据绑定的UserDetailsLabel 属性引发PropertyChanged 事件。

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

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

    【讨论】:

    • 我知道这是应该的,但该属性是 get-only,我从不设置 UserDetailsLabel。我不能在改变文化时引发事件,因为另一个模块不“知道”这个。
    • 这就是事件聚合器的作用:blog.magnusmontin.net/2014/02/28/…
    • 谢谢,这更有帮助。我从 Loaded 事件切换到事件聚合器。这对于特定模块中发生的其他事件也非常有用。
    【解决方案2】:

    我通过在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));
    }
    

    【讨论】:

    • 为什么视图会告诉视图模型更新。它应该是其他方式。此外,如果您在加载视图后更改文化,则此方法将不起作用。
    • @mm8 到目前为止,这是可行的,这个模块无法改变文化。我知道它并不完美,但只有一个模块可以改变文化并更新自己的观点
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2010-11-26
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多