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
コードを書かずにこれを達成する方法はありますか?
ありがとう