【发布时间】:2014-06-04 16:06:33
【问题描述】:
我有两个 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)。
导航回第一个视图后,我将如何更新 List Products 绑定?
我使用的是 MVVMLight 提供的 ViewModelLocator,因此无法从第二个 ViewModel 静态访问第一个 ViewModel。
我当前的解决方法是创建一个 BaseView 页面,覆盖 OnNavigatedTo 方法,在此覆盖中引发一个事件,然后我可以在我的第一个 ViewModel 中绑定一个命令,这样我就可以调用 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);
}
}
【问题讨论】:
-
您还有疑问,或者您的问题解决了吗?您可以在您的 VM 上使用从您的第一页 OnNavigatedTo 方法调用的 Refresh 方法,而不是使用事件触发器等。更简单的方法
标签: windows-phone-8 mvvm mvvm-light