gpt4 book ai didi

windows-phone-7 - 页面导航后如何刷新PivotItem的DataContext

转载 作者:行者123 更新时间:2023-12-03 10:19:39 26 4
gpt4 key购买 nike

在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的 View 模型。

使用这样的简单模型类:

public class MyModel {
public int Id { get; set; }
public string Name { get; set; }
}

ListView View 的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>
...

对于列表中的每个项目,只需输入两行即可。名称显示在第一行,该按钮用于我们要编辑的项目。该 View 的 View 模型为:

...
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 View ,并传递所选模型项的ID。

EditView页面很简单,只有一个文本框和一个保存按钮。该 View 模型看起来类似于:

...
public EditViewModel() { // ctor
var id = GetQueryString("id");
Model = repository.Get(id);
}
...

“编辑”页面运行良好,它将更改保存回db。但是,在保存操作之后,我执行了 Navigator.GoBack(),旧数据显示在此处。我该如何强制我的列表更新新更改,同时避免出现代码隐藏现象?

我可以使用MainPage代码背后的数据透视控件Loaded事件来实现此目标,如下所示:

private void pivot_Loaded(object sender, RoutedEventArgs e) {
var selectedPivotItem = (PivotItem)pivot.SelectedItem;
((ListViewModel)selectedPivotItem.DataContext).Rebind();
}

我在ListViewModel中添加了一个 Rebind()方法,该方法基本上与构造函数相同,再次获取所有数据并将其分配给 ModelItems
有没有一种方法可以实现而无需编写任何代码?

谢谢

最佳答案

我习惯于使用单例模式创建一个名为AppLifeService的类。在此对象中,我存储了用于在页面之间导航的各种属性。

当您在执行操作(编辑/删除/创建)的页面中时,只需将修改后的对象放在AppLifeService中的某些属性中,例如DeletedComment

然后在上一页的OnNavigatedTo方法中,确认它是后退并搜索您的对象。

    protected override void OnNavigatedTo(NavigationEventArgs e, NavigationContext context, NavigationService navigationService)
{
base.OnNavigatedTo(e, context, navigationService);

// back from other app page
if (e.NavigationMode == NavigationMode.Back)
{
var lifeService = ApplicationServices.Resolve<AppLifeService>();

新台币?
var DeletedComment = lifeService.DeletedComment;
如果(deletedComment!= null)
{
//删除评论
}

确保您没有存储重物,以免阻塞内存。并在使用时将其删除。

关于windows-phone-7 - 页面导航后如何刷新PivotItem的DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com