VM的过多模型

时间:2018-11-07 02:00:03

标签: c# wpf oop mvvm solid-principles

使用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在模型或接口上的某些特定用途?

1 个答案:

答案 0 :(得分:0)

我想到的一个技巧是创建一个View + ViewModel-帮助您编辑并将更改保存到Dictionary。接下来,将方法添加到所有模型中,以帮助转换ToDictionary()并加载FromDictionary()。

以这种方式编辑任何模型,首先将其转换为字典(键是属性Name,值是要编辑的值)。然后,您的视图将帮助您编辑值(**现在很难进行数据类型和业务验证**)。然后在“保存命令”上,您要做的就是从“字典”中更新对象。

事业: 模型不应具有ObservableCollection。