MVVM-决定哪个ViewModel负责什么

MVVM-决定哪个ViewModel负责什么,mvvm,mvvm-light,Mvvm,Mvvm Light,我有一个简单的应用程序,包括: 型号 项目 应用于该项目列表的筛选条件 视图 欢迎光临 主要项目 过滤编辑页 我正在使用MVVM Light和Windows Phone 7 我目前有3个视图模型,每个视图一个。在过去,我有一个单一的视图模型,这使得我要问的通信非常容易。然而,我想使用3个独立的虚拟机,因为这似乎是正确的方法 WelcomePage可以在导航到MainItemsPage之前设置一个筛选条件。MainItemsPage绑定到由其ViewModel公开的Items属性。该Vie

我有一个简单的应用程序,包括:

型号

  • 项目
  • 应用于该项目列表的筛选条件
视图

  • 欢迎光临
  • 主要项目
  • 过滤编辑页
我正在使用MVVM Light和Windows Phone 7

我目前有3个视图模型,每个视图一个。在过去,我有一个单一的视图模型,这使得我要问的通信非常容易。然而,我想使用3个独立的虚拟机,因为这似乎是正确的方法

WelcomePage可以在导航到MainItemsPage之前设置一个筛选条件。MainItemsPage绑定到由其ViewModel公开的Items属性。该ViewModel需要根据当前筛选条件筛选该列表。FilterEdit页面允许用户编辑由4个变量组成的完整标准集。更改条件后,需要重新筛选MainItemsPage的ViewModel中使用的Items集合

问题是我如何在应用程序中传递过滤器更改。我知道MVVM有消息传递的概念,MVVM Light toolkit提供了Messenger类。然而,我正在挣扎的是,发送这些信息的责任在哪里

  • 3个虚拟机在需要使用当前过滤器集时是否会转到模型
  • 是否所有过滤器更新都通过FilterEditViewModel,然后广播过滤器更改消息
  • 对于所有视图,我是否返回到单个VM
  • 我看不见。正在工作,因为需要触发VM返回模型 我知道我能得到3分。现在工作没有问题。这是错的吗

    短暂性脑缺血发作


    Pat Long

    在您的场景中,三个虚拟机是正确的方式。我建议您在虚拟机之间建立父/子关系。因为MainVM保存着ItemList,所以这里是应用FilterChanges的地方。FilterEditVM只接收过滤器更改,然后调用MainVM,它必须重新应用过滤器

    结构应该是这样的:

    public class WelcomePageVM
    {
        public WelcomePageVM()
        {
            this.FilterEditPageVM = new FilterEditPageVM(this);
            this.MainItemsVM = new MainItemsVM(this);
        }
    
        public FilterEditPageVM FilterEditPageVM { get; private set; }
    
        public MainItemsVM MainItemsVM { get; private set; }
    
        public void SetInitialFilter1(object filter)
        {
            // the initial filter
            this.FilterEditPageVM.Filter1Value = filter;
            this.MainItemsVM.ApplyFilters();
        }
    }
    
    public class FilterEditPageVM : ChildViewModelBase<WelcomePageVM>
    {
        public FilterEditPageVM(WelcomePageVM parent)
            : base(parent) { }
    
        public object Filter1Value { get; set; }
        public object Filter2Value { get; set; }
        public object Filter3Value { get; set; }
        public object Filter4Value { get; set; }
    
        public void FinishFilterChange()
        {
            this.Parent.MainItemsVM.ApplyFilters();
        }
    }
    
    public class MainItemsVM : ChildViewModelBase<WelcomePageVM>
    {
        public MainItemsVM(WelcomePageVM parent)
            : base(parent) { }
    
        public List<object> ItemList { get; set; }
    
        public void ApplyFilters()
        {
            // filter apply logic
        }
    }
    
    public abstract class ChildViewModelBase<T>
    {
        T _parent;
    
        public ChildViewModelBase(T parent)
        {
            this._parent = parent;
        }
    
        public T Parent { get { return _parent; } }
    }
    
    公共类WelcomePageVM
    {
    公共WelcomePageVM()
    {
    this.FilterEditPageVM=新的FilterEditPageVM(this);
    this.MainItemsVM=新的MainItemsVM(this);
    }
    public FilterEditPageVM FilterEditPageVM{get;private set;}
    公共mainitesvm mainitesvm{get;private set;}
    public void SetInitialFilter1(对象筛选器)
    {
    //初始过滤器
    this.FilterEditPageVM.Filter1Value=过滤器;
    this.mainitesvm.ApplyFilters();
    }
    }
    公共类FilterEditPageVM:ChildViewModelBase
    {
    公共筛选器EditPageVM(WelcomePageVM父级)
    :基(父){}
    公共对象筛选器1value{get;set;}
    公共对象筛选器2value{get;set;}
    公共对象筛选器3value{get;set;}
    公共对象筛选器4value{get;set;}
    public void FinishFilterChange()
    {
    this.Parent.mainitesvm.ApplyFilters();
    }
    }
    公共类MainItemsVM:ChildViewModelBase
    {
    公共MainItemsVM(WelcomePageVM父级)
    :基(父){}
    公共列表项列表{get;set;}
    公共无效ApplyFilters()
    {
    //过滤器应用逻辑
    }
    }
    公共抽象类ChildViewModelBase
    {
    父母;
    公共子视图模型库(T父级)
    {
    这个。_parent=parent;
    }
    公共T父项{get{return\u Parent;}
    }
    

    在这里,您可以访问所有viewmodels,这很好,因为您处于“控制器”级别。

    在您的场景中,三个虚拟机是正确的方式。我建议您在虚拟机之间建立父/子关系。因为MainVM保存着ItemList,所以这里是应用FilterChanges的地方。FilterEditVM只接收过滤器更改,然后调用MainVM,它必须重新应用过滤器

    结构应该是这样的:

    public class WelcomePageVM
    {
        public WelcomePageVM()
        {
            this.FilterEditPageVM = new FilterEditPageVM(this);
            this.MainItemsVM = new MainItemsVM(this);
        }
    
        public FilterEditPageVM FilterEditPageVM { get; private set; }
    
        public MainItemsVM MainItemsVM { get; private set; }
    
        public void SetInitialFilter1(object filter)
        {
            // the initial filter
            this.FilterEditPageVM.Filter1Value = filter;
            this.MainItemsVM.ApplyFilters();
        }
    }
    
    public class FilterEditPageVM : ChildViewModelBase<WelcomePageVM>
    {
        public FilterEditPageVM(WelcomePageVM parent)
            : base(parent) { }
    
        public object Filter1Value { get; set; }
        public object Filter2Value { get; set; }
        public object Filter3Value { get; set; }
        public object Filter4Value { get; set; }
    
        public void FinishFilterChange()
        {
            this.Parent.MainItemsVM.ApplyFilters();
        }
    }
    
    public class MainItemsVM : ChildViewModelBase<WelcomePageVM>
    {
        public MainItemsVM(WelcomePageVM parent)
            : base(parent) { }
    
        public List<object> ItemList { get; set; }
    
        public void ApplyFilters()
        {
            // filter apply logic
        }
    }
    
    public abstract class ChildViewModelBase<T>
    {
        T _parent;
    
        public ChildViewModelBase(T parent)
        {
            this._parent = parent;
        }
    
        public T Parent { get { return _parent; } }
    }
    
    公共类WelcomePageVM
    {
    公共WelcomePageVM()
    {
    this.FilterEditPageVM=新的FilterEditPageVM(this);
    this.MainItemsVM=新的MainItemsVM(this);
    }
    public FilterEditPageVM FilterEditPageVM{get;private set;}
    公共mainitesvm mainitesvm{get;private set;}
    public void SetInitialFilter1(对象筛选器)
    {
    //初始过滤器
    this.FilterEditPageVM.Filter1Value=过滤器;
    this.mainitesvm.ApplyFilters();
    }
    }
    公共类FilterEditPageVM:ChildViewModelBase
    {
    公共筛选器EditPageVM(WelcomePageVM父级)
    :基(父){}
    公共对象筛选器1value{get;set;}
    公共对象筛选器2value{get;set;}
    公共对象筛选器3value{get;set;}
    公共对象筛选器4value{get;set;}
    public void FinishFilterChange()
    {
    this.Parent.mainitesvm.ApplyFilters();
    }
    }
    公共类MainItemsVM:ChildViewModelBase
    {
    公共MainItemsVM(WelcomePageVM父级)
    :基(父){}
    公共列表项列表{get;set;}
    公共无效ApplyFilters()
    {
    //过滤器应用逻辑
    }
    }
    公共抽象类ChildViewModelBase
    {
    父母;
    公共子视图模型库(T父级)
    {
    这个。_parent=parent;
    }
    公共T父项{get{return\u Parent;}
    }
    

    在这里,您可以访问所有viewmodels,这很好,因为您处于“控制器”级别。

    我会将共享当前过滤器放在模型中,而不是视图模型中。可能在不同的页面或同一页面上有很多viewModels(请考虑显示当前选择的面包屑,以及需要显示已应用筛选器的其他内容)


    视图模型可以订阅的过滤器的单例模型如何?

    我会将共享当前过滤器放在模型中,而不是视图模型中。在不同的页面或同一页面上可能有很多viewModels(考虑一个面包)