使用WPF和MVVM模式设计应用程序时遇到问题。
模型是单个组件(假设,公司)。
class Company
{
private string _Name;
public ObservableCollection<Manager> Managers {get; set;}
public ObservableCollection<Director> Directors {get; set;}
public ObservableCollection<Tester> Testers {get; set;}
}
此模型有一个VM和一个View。 我将省略诸如InotifyPropertyChanged之类的细节,我们假定它们在基本ViewModel类中实现,Command和Mediator对象对应于经典模式的实现
class CompanyViewModel: ViewModel
{
private Company _Company;
public ICommand AddManagerCommand { get; }
public ICommand AddTesterCommand { get; }
public ICommand AddDirectorCommand { get; }
public CompanyViewModel()
{
_Company = new Company();
AddManagerCommand = new Command(OnAddManagerExecuted);
AddTesterCommand = new Command(OnAddTesterExecuted);
AddDirectorCommand = new Command(OnAddDirectorExecuted);
Mediator.Register("GetManager", OnGetManager);
...
...
}
private void OnGetManager(object obj)
{
_Company.Managers.Add((Employee)obj);
}
}
在此模型内部,它包含许多对象。与公司类似,他们可以表示为经理,董事,测试员的雇员,并且都继承自Employee类。
class Employee
{
public string Name {get; set;}
}
class Manager : Employee
{
public string Age {get; set;}
public string Sex {get; set;}
}
class Director : Employee
{
public string Age {get; set;}
public string Education {get; set;}
}
...
为编辑每种类型的工作者,提供了自己的演示文稿和自己的VM。
class ManagerViewModel : ViewModel
{
public Command SaveCommand {get; private set;}
public ManagerViewModel()
{
SaveCommand = new Command(OnSaveCommandExecuted)
}
private void OnSaveCommandExecuted(object window)
{
Mediator.NotifyColleggues("GetManager", new Manager())
}
}
因此,通过这种方法,我为每种类型的员工以及公司模型中的ObservableCollection提供了许多VM和视图。 因此,在添加新类型的员工时,我必须从Employee继承一个新类,创建一个新VM,一个新View,在Mediator中注册一条新消息,以通知VM Company关于将新元素从ObservableCollection中添加到ObservableCollection的信息。查看新员工类型,并向VM Company添加新命令以调用员工编辑窗口。在我看来,这种架构非常僵化,我想知道哪种解决方案可以帮助我提高系统的可伸缩性,也许是Facade在模型或接口上的某些特定用途?
答案 0 :(得分:0)
我想到的一个技巧是创建一个View + ViewModel-帮助您编辑并将更改保存到Dictionary。接下来,将方法添加到所有模型中,以帮助转换ToDictionary()并加载FromDictionary()。
以这种方式编辑任何模型,首先将其转换为字典(键是属性Name,值是要编辑的值)。然后,您的视图将帮助您编辑值(**现在很难进行数据类型和业务验证**)。然后在“保存命令”上,您要做的就是从“字典”中更新对象。
事业: 模型不应具有ObservableCollection。