【问题标题】:How to Cleanup a ViewModel in Mvvm Light?如何在 Mvvm Light 中清理 ViewModel?
【发布时间】:2013-11-10 22:02:03
【问题描述】:

我有一个转到另一个页面的项目列表,该页面已连接到视图模型。在此视图模型的构造函数中,我有从服务器获取该特定项目的数据的代码。

我发现当我点击后退按钮并从列表中选择另一个项目并转到另一个页面时,构造函数没有被命中。

我认为这是因为现在创建了 VM,并且认为它不需要一个新的。我想知道如何强制清理,以便在我从列表中选择时始终抓取新的?

【问题讨论】:

  • 如何检索 ViewModel?通过 XAML 还是通过代码隐藏?
  • 你不能使用定位器并拥有一个全面一致的静态参考吗?
  • 看一眼答案(以防您没有从答案的评论中得到通知)。

标签: windows-phone-7 mvvm mvvm-light


【解决方案1】:

我遇到了同样的问题,我就是这样解决的。

有一个 BaseView 类,覆盖 OnNavigatedTo

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        if (NavigatedToCommand != null && NavigatedToCommand.CanExecute(null))
            NavigatedToCommand.Execute(null);
    }

添加 DependencyProperty。

   public static readonly DependencyProperty NavigatedToCommandProperty =
         DependencyProperty.Register("NavigatedToCommand", typeof(ICommand), typeof(BaseView), null);
    public ICommand NavigatedToCommand
    {
        get { return (ICommand)GetValue(NavigatedToCommandProperty); }
        set { SetValue(NavigatedToCommandProperty, value); }
    }

在必要的页面上,添加到 xaml(当然,继承 BaseView )

NavigatedToCommand="{Binding OnNavigatedToCommand}"

在 ViewModel 中,自己制作命令

public RelayCommand OnNavigatedToCommand
        { get { return new RelayCommand(OnNavigatedTo); } }

并实现您要调用的更新列表的方法

public async void OnNavigatedTo()
    {
        var result = await myDataService.UpdateMyList();
        if (result.Status == OK)
            MyList = result.List;
    }

因此,现在,每次您导航到带有列表的页面时,在覆盖的 OnNavigatedTo() 内,都会执行一个 NavigatedToCommand,该命令将执行 OnNavigatedToCommand(您在 xaml 中设置),该命令将调用 OnNavigatedTo,这将更新您的列表。

有点乱,但是 MVVM :)

编辑:清洁怎么样,它们可以在 OnNavigatedFrom() 中完成,它的工作原理是一样的。或 OnNavigatingFrom(),在某些情况下也很有用。

【讨论】:

  • 嘿,chobo,仔细检查一下这个解决方案。看来,这会导致内存泄漏。不过,我不确定 - 仍在调查。
  • 虽然它可以解决 OP 的问题,但它没有回答“如何清理视图模型”。
  • @JeffRSon 为什么不呢?只需在 OnNavigatedFrom() 中进行所有清理,其工作原理相同。
  • 在我看来,实际用例对于一般问题来说太特殊了。也许应该改写标题。
  • @JeffRSon 我刚刚重新阅读了这个问题。他的列表清理问题可以通过ViewModel.OnNavigatedTo() { MyList.ReplaceWith(pulledList); } 精确解决。
猜你喜欢
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
相关资源
最近更新 更多