wpf - 如何使用 MVVM 在 WPF 中的多语言数据编辑器中对数据进行建模?

标签 wpf data-binding oop mvvm multilingual

在设计一个模型/ View 模型来表示应用程序中的数据时,是否有任何好的做法可以遵循,该应用程序将以多种语言查看/编辑该数据?我们的顶级类——我们称之为 Course——包含几个集合属性,比如 Books 和 TopicsCovered,它们每个都可能在其数据中具有一个集合属性。 我应该实现什么样的类结构来保存多种语言的某些属性的数据?

例如,数据需要用不同语言表示 course1.Books.First().Title,用不同语言表示 course1.TopicsCovered.First().Name。我们想要一个可以编辑任何可用语言的给定类(class)的任何数据的应用程序 - 以及编辑非语言特定的数据,可能是一本书的作者(即 course1.Books.First()。作者)。我们无法确定如何最好地设置模型以在 XAML View 中启用绑定(bind)。

例如,我们是否(在单语言模型中)将每个 String 替换为 LanguageSpecificString 实例的集合?所以要获得当前语言的标题:

course1.Books.First().Title.Where(lss => lss.Language==CurrentLanguage).SingleOrDefault()

如果我们这样做,我们就不能轻易地绑定(bind)到一种给定语言的任何值,只能绑定(bind)到语言值的集合,例如 ItemsControl。
<TextBox Text={Binding Title.???} />  <!-- no way to bind to the current language title -->

我们是否将顶级 Course 类(class)替换为特定语言类(class)的集合?所以要获得当前语言的标题:
course1.GetLanguage(CurrentLanguage).Books.First().Title

如果这样做,我们一次只能轻松地使用一种语言;我们可能希望 View 显示一种语言并让用户编辑另一种语言。
<TextBox Text={Binding Title} />  <!-- good -->
<TextBlock Text={Binding ??? } />  <!-- no way to bind to the other language's title-->

此外,它的缺点是不能表示语言中立的数据;每个属性(例如作者)似乎都使用多种语言。即使是非字符串属性也会有多种语言。

这两者之间有选择吗?还有其他我们没有想到的方法吗?

我意识到这有点模糊,但它似乎是一个设计起来有点普遍的问题。

注意:这不是关于提供多语言 UI 的问题,而是关于以灵活的方式实际编辑多语言数据的问题。

编辑:所以问题是我们应该如何为类建模?像这样的东西:
Class Course { 
    ObservableCollection<Book> Books
    ObservableCollection<Topic> TopicsCovered
}
Class Book {
    ObservableCollection<LanguageSpecificString> Title
    String Author
}
Class Topic {
    ObservableCollection<LanguageSpecificString> Name
}
Class LanguageSpecificString {
    String LanguageCode
    String Value
}

或者应该是这样的:
Class MultilingualCourse { 
    Course GetLanguage(string languageCode)
}
Class Course { 
    ObservableCollection<Book> Books
    ObservableCollection<Topic> TopicsCovered
}
Class Book {
    String Title
    String Author
}
Class Topic {
    String Name
}

或者完全是别的什么?

最佳答案

这个怎么样(我在我的例子中省略了更改通知):

public class BookViewModel
{
    private readonly Book book;
    private readonly CultureInfo viewCulture;

    // constructor
    public BookViewModel(Book book, CultureInfo viewCulture)
    {
        this.book = book;
        this.viewCulture = viewCulture;
    }

    public string OriginalTitle
    {
        get { return this.book.OriginalTitle; }
        set { this.book.OriginalTitle = value; }
    }

    public string TranslatedTitle
    {
        get { return this.book.GetCultureSpecificTitle(this.viewCulture); }
        set { this.book.SetCultureSpecificTitle(this.viewCulture, value); }
    }

    public string Author
    {
        get { return this.book.Author; }
        set { this.book.Author = value; }
    }
}

您还提到需要在涉及多种语言的情况下构建 View 。我在这里假设你正在构建一个翻译界面,你只需要显示原始语言和翻译目标语言。

但是,如果您需要能够并排显示任何两种语言,您仍然可以使用 viewCulture1 构建 View 模型。和 viewCulture2 ,以及相应的公开属性,如 Title1Title2 .或者,您可以构建复合 View ,其中 View 的不同部分具有具有不同关联语言的 View 模型(参见 Josh Smith's example 中嵌套 View 模型和数据模板的使用)。

您还可以将 View 文化公开为可变属性,并将组合框绑定(bind)到它以动态地让用户在语言之间切换 View 等。

对于模型方面,我使用了 GetCultureSpecificXSetCultureSpecificX方法,但替代机制(如您的 IEnumerable<LanguageSpecificString> 建议)也可以适应 View 模型中的简单字符串属性。

关于wpf - 如何使用 MVVM 在 WPF 中的多语言数据编辑器中对数据进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518168/

相关文章:

wpf - 使用属性触发器更改已绑定(bind)的属性

c# - ComboBox 在数据绑定(bind)更新后变为空白,即使数据更新成功

c# - 将多个文本框值绑定(bind)到单个属性

php - PDO 类的通用插入方法

c# - WPF TabItem 标题 - 强制按钮占用整个标题空间

c# - 使用枚举是列出不同 "Types of Car"的最佳方式吗

java - 无法在面向对象编程、数组中为函数赋值

c# - F# 在哪些区域生成 "absolute no sense in using"?

c# - MVVM 光 5.0 : How to use the Navigation service

java - 我如何将两个子字符串绑定(bind)到一个?