在 WP 7.1 项目中,我有一个 MainPage.xaml。在那里,我有一个来自 WP Toolkit 的 Pivot 控件,如下所示:
<c:Pivot x:Name="pivot" Title="title">
<c:PivotItem Header="header" DataContext="{vm:ListViewModel}">
<v:ListView />
</c:PivotItem>
...
</c:Pivot>
基本上,我将第一个数据透视项的内容设置为我创建的一个名为 ListView 的 UserControl,并为它创建了一个名为 ListViewModel 的视图模型。
使用这样的简单模型类:
public class MyModel {
public int Id { get; set; }
public string Name { get; set; }
}
ListView 视图的 xaml 如下所示:
...
<ListBox x:Name="list" ItemsSource="{Binding ModelItems"}>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<Button Command="{Binding DataContext.EditCommand, ElementName=list}"
CommandParameter="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}">
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
...
列表中的每个项目只需一个简单的 2 行条目。名称显示在第一行,该按钮用于我们要编辑该项目时。此视图的视图模型是:
...
private ObservableCollection<MyModel> modelItems;
public ObservableCollection<MyModel> ModelItems {
get { return modelItems; }
set {
if (modelItems != value) {
modelItems = value;
NotifyPropertyChanged(() => this.ModelItems);
}
}
}
public ListViewModel() {
ModelItems = new ObservableCollection<MyModel>(repository.GetAll());
}
public ICommand EditCommand {
get {
return new RelayCommand(o => {
var model = o as MyModel;
Navigator.Uri<EditView>()
.WithParam("id", model.id)
.Navigate();
}
}
...
到目前为止一切正常,列表已正确填充。单击按钮正确导航到 EditView 视图,并传递所选模型项的 id。
EditView 页面很简单,只有一个文本框和一个保存按钮。它的视图模型看起来与此类似:
...
public EditViewModel() { // ctor
var id = GetQueryString("id");
Model = repository.Get(id);
}
...
编辑页面运行良好,它将更改保存回 db。但是,在保存操作之后,我做了 aNavigator.GoBack()
并且旧数据显示在那里。我应该如何强制我的列表更新新的更改,同时避免代码隐藏?
我能够使用 MainPage 代码隐藏中的枢轴控件 Loaded 事件来实现这一点,如下所示:
private void pivot_Loaded(object sender, RoutedEventArgs e) {
var selectedPivotItem = (PivotItem)pivot.SelectedItem;
((ListViewModel)selectedPivotItem.DataContext).Rebind();
}
我向我的 ListViewModel 添加了一个Rebind()
方法,该方法与构造函数的作用基本相同,再次获取所有数据并将其分配给ModelItems
有没有办法实现这一点而无需编写任何代码?
谢谢