我有两个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);
}
}
答案 0 :(得分:0)
除了上面的解决方法,我之前研究过在ViewModels之间实现消息传递。不幸的是,这对我不起作用,因为我忘记在调用Register方法时包含Token。一旦我对此进行了排序,我就能够从第二个ViewModel发送一条消息,由第一个接收,因此根据需要调用RaisePropertyChanged方法。
此外,一旦我意识到SimpleIoC在多次调用GetInstance后返回了同一个实例,这有助于我理解。