在设计一个模型/ 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
,以及相应的公开属性,如 Title1
和 Title2
.或者,您可以构建复合 View ,其中 View 的不同部分具有具有不同关联语言的 View 模型(参见 Josh Smith's example 中嵌套 View 模型和数据模板的使用)。您还可以将 View 文化公开为可变属性,并将组合框绑定(bind)到它以动态地让用户在语言之间切换 View 等。
对于模型方面,我使用了
GetCultureSpecificX
和 SetCultureSpecificX
方法,但替代机制(如您的 IEnumerable<LanguageSpecificString>
建议)也可以适应 View 模型中的简单字符串属性。
关于wpf - 如何使用 MVVM 在 WPF 中的多语言数据编辑器中对数据进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518168/