当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

mvvm-决定哪个viewmodel负责什么

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

型号

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

视图

  • 欢迎使用第页
  • 主要项目页面
  • 筛选编辑页

我正在使用MVVM Light和Windows Phone 7

我现在有3个视图模型,每个视图一个。在过去,我有一个单一的视图模型,使我即将询问的沟通非常容易。不过,我想使用3个独立的虚拟机,因为这似乎是正确的方法。

Welcomepage可以在导航到Mainitemspage之前设置一个筛选条件。mainitemspage绑定到由其viewmodel公开的items属性。该视图模型需要根据当前筛选条件筛选该列表。filtereditpage允许用户编辑4个变量的完整条件集。更改条件后,需要重新筛选ViewModel for Mainitems页面中使用的项集合。

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

  1. 当3个vm需要使用当前过滤器集时,它们是否会转到模型?
  2. 是否所有筛选器更新都经过FilterEditViewModel,然后再广播筛选器更改消息?
  3. 对于所有视图,我是否返回到一个vm?

我看不到1。工作是因为需要触发vm返回模型 我知道我能得到3分。现在工作没问题。是不是错了?

短暂性脑缺血发作

帕特龙

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

视图模型可以订阅的过滤器的单例模型怎么样?

在您的场景中,三个vm是正确的方法。我建议您在vm之间建立一个父/子关系。因为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; } }
}

在这里,您可以访问所有视图模型,这是可以的,因为您保持在'控制器'级别。

转载请注明:我的代码 » mvvm-决定哪个viewmodel负责什么