2

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 行で入力するだけです。名前は1行目に表示され、ボタンはその項目を編集したいときのものです。このビューのビュー モデルは次のとおりです。

...
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();
    }
}
...

これまでのところ、すべてがうまく機能しており、リストは正しく入力されています。ボタンをクリックすると、選択したモデル アイテムの ID を渡す EditView ビューに正しく移動します。

EditView ページはシンプルで、テキスト ボックスと保存ボタンのみです。そのためのビュー モデルは次のようになります。

...
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

コードを書かずにこれを達成する方法はありますか?

ありがとう

4

1 に答える 1

0

私は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; if (deletedComment != null) { // コメントを削除 }

メモリが詰まらないように、重いオブジェクトを格納しないようにしてください。また、使用した場合は削除してください。

于 2013-12-21T02:06:02.297 に答える