如何区分 UI 绑定模型对象和传递给中间层的模型对象
Posted
技术标签:
【中文标题】如何区分 UI 绑定模型对象和传递给中间层的模型对象【英文标题】:How to differentiate UI binding Model objects and Model objects which are passed to middle tier 【发布时间】:2016-06-18 15:39:34 【问题描述】:==> a) UI 模型对象:即我有属性更改通知的类 (INotifyPropertyChanged),SelectedItemXXX 绑定到 Some ComboBox SelectedItem
==> b) 模型对象:只是普通对象,即 POCO(普通旧 CLR 对象)
问题1)一般来说,拥有这样的模型更好。我的意思是我们只需要维护模型(a)吗?
问题 2)如果我们维护两个模型。有什么更好的方法。我们能否有一些关联或一些方法来生成模型对象(b)。
问题 3) 如果我们有两个模型,一般遵循什么命名约定。 我把它命名为 PersonUI,我的意思是 Person 有更好的命名方式吗?
谢谢
【问题讨论】:
【参考方案1】:问题 1 的答案:否。您经常需要简单的模型对象来在您的 UI 模型领域之外执行现实世界的业务逻辑(也称为域逻辑)。在Single Responsibility Principal 之后,您不应该将您的 UI 模型对象与业务模型对象混淆。
问题 2 的答案:是 - 一个非常常用的模式是MVVM:
M - 代表模型(业务或领域逻辑层) V - 代表视图(在 WPF 和 Silverlight 中,它是 XAML 和代码隐藏) VM 代表 ViewModel(或者用你的话来说就是 UI Model 对象)MVVM 是 WPF 和 SilverLight 的推荐最佳实践。它将 UI 与模型分开,并允许更轻松的测试和重用。
问题 3 的答案:您的 UI 模型对象 (a) 的常见命名约定是使用 XXXXViewModel
。例如,如果您有一个名为 Giraffe.xaml
的 WPF 控件和 Giraffe.xaml.cs
的相应代码隐藏文件,那么您的视图模型文件的名称将是 GiraffeViewModel.cs
并且类看起来像:
public class GiraffeViewModel : INotifyPropertyChanged
..
将模型对象的名称保留在内部包含的逻辑中。例如:GiraffeVision.cs
【讨论】:
这是命名约定的问题。让我们有员工注册视图和相应的视图模型,即 EmployeeRegisterViewModel。现在 EmployeeRegisterView 需要某种对象,这些对象需要绑定到特定的 UI 控件,比如说 EmployeePersonal 信息需要捕获 SelectedItem 的位置。如果我将该对象命名为 EmployeePersonalInfoViewModel,那么它将是一长串 ViewModel,当我们想要搜索 MainViewModel(EmployeeRegisterViewModel) 以处理某种获取数据问题时,这会让人感到困惑。就像 GetData 不起作用。 在这种情况下,您的 EmployeePersonalInformation 对象将是 EmployeeRegisterViewModel 中的 ObservableCollection 属性。 ObservableCollections 是网格或模板中使用的模型对象的列表,因此您可以在视图中显示其中的许多对象。请参阅wpfgrid.blogspot.de/2014/02/… - 注意中间的 Trades 模型类。该领域模型被放入 ObservableCollection 中,以便在 TradesView 中动态显示。 在实际情况下它不是一个集合对象。我只是给出了示例场景。我们需要维护不是集合项的可绑定对象。它们是一对一的。但我需要从中获取信息用户界面控件。这个 UI 控件应该绑定到某个对象(即 INotifiable、SelectedXXX ..)。它实际上是 ViewModel 。但是现在如果我将它命名为 XXX_ViewModel ......它令人困惑......搜索文件......找到 MainViewModel(在哪里实际逻辑用于调用中间层和其他命令)。 如果您的控件是可重用的,那么它们可以被分解并编码在单独的 XXX.xaml 文件中,您还可以拥有控件级别的 XXXXViewModel.cs 文件以遵循命名约定。它通常更适合重用和测试以具有更小的可重用 UI 元素。请针对您的问题发布具体问题,我们可以为您提供更具体的解决方案和答案。以上是关于如何区分 UI 绑定模型对象和传递给中间层的模型对象的主要内容,如果未能解决你的问题,请参考以下文章