如何在Mvvm Light中清理ViewModel?

时间:2013-10-31 02:21:14

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

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

我发现当我点击后退按钮并从帽子列表中选择另一个项目并进入另一页时,构造函数不会被击中。

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

1 个答案:

答案 0 :(得分:0)

我面临同样的问题,这就是我如何解决它。

拥有一个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中,make命令本身

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(),在某些情况下也很有用。