我有一个转到另一个页面的项目列表,该页面已连接到视图模型。在此视图模型的构造函数中,我有从服务器获取该特定项目的数据的代码。
我发现,当我点击后退按钮并从列表中选择另一个项目并转到另一个页面时,构造函数不会被命中。
我认为这是因为现在创建了 VM,并且认为它不需要一个新的。我想知道如何强制清理,以便在我从列表中选择时总是抓住一个新的?
我有一个转到另一个页面的项目列表,该页面已连接到视图模型。在此视图模型的构造函数中,我有从服务器获取该特定项目的数据的代码。
我发现,当我点击后退按钮并从列表中选择另一个项目并转到另一个页面时,构造函数不会被命中。
我认为这是因为现在创建了 VM,并且认为它不需要一个新的。我想知道如何强制清理,以便在我从列表中选择时总是抓住一个新的?
我遇到了同样的问题,我就是这样解决的。
有一个 BaseView 类,覆盖 OnNavigatedTo
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (NavigatedToCommand != null && NavigatedToCommand.CanExecute(null))
NavigatedToCommand.Execute(null);
}
添加依赖属性。
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(),在某些情况下也很有用。