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