Windows Phone - 如何在导航时刷新viewmodel

时间:2014-06-04 16:06:33

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

我有两个ViewModel,第一个有ProductViewModel类型的列表,这个类型为ProductViewModel的列表由我的模型中的Product类型列表支持。

public List<ProductViewModel> Products
{
    get
    {
        return (from product in ProductManager.Products
               select new ProductViewModel(product)).ToList();
    }
}

我的第一个ViewModel会将产品添加到ProductManager.Products列表中,然后引发PropertyChanged通知,以便更新UI。 (到目前为止一直很好)。

然后发生导航到第二页,然后访问ProductManager.Products,处理完这些产品后,ProductManager.Products列表被清除(由第二个ViewModel)。

导航回第一个视图后,我如何更新列表产品绑定?

我正在使用MVVMLight提供的ViewModelLocator,因此没有静态访问第二个ViewModel。

我目前的解决方法是创建一个BaseView页面,覆盖OnNavigatedTo方法,在此覆盖中引发一个事件,然后我可以在我的第一个ViewModel中绑定一个Command,以便我可以调用RaisePropertyChanged。

public class BaseView : PhoneApplicationPage
{
    public event RoutedEventHandler NavigatedTo;
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        if (NavigatedTo != null)
        {
            NavigatedTo(this, new RoutedEventArgs());
        }
    }
}

    <i:EventTrigger EventName="NavigatedTo">
        <cmdextras:EventToCommand Command="{Binding Path=PerformNavigatedTo}" />
    </i:EventTrigger>

    public ICommand PerformNavigatedTo
    {
        get
        {
            return new RelayCommand(
                () =>
                {
                    RaisePropertyChanged(() => Products);
                    RaisePropertyChanged(() => SecondaryPageName);
                },
                () => true);
        }
    }

1 个答案:

答案 0 :(得分:0)

除了上面的解决方法,我之前研究过在ViewModels之间实现消息传递。不幸的是,这对我不起作用,因为我忘记在调用Register方法时包含Token。一旦我对此进行了排序,我就能够从第二个ViewModel发送一条消息,由第一个接收,因此根据需要调用RaisePropertyChanged方法。

此外,一旦我意识到SimpleIoC在多次调用GetInstance后返回了同一个实例,这有助于我理解。