私は WPF、MVVM、およびエンティティ フレームワークを使用しています。
私はデータ入力アプリケーションを使用しており、アプリで変更のキャンセルを有効にしようとしています。変更がキャンセルされると、すべての値が元の値にリセットされます。EF側のセットアップはすべて正しく行われていると思います。基本的に、変更されたリストにある場合、すべてのエンティティを未変更に設定するだけです。
私の問題は、ViewModel に戻ったときで、すべてのフィールドと派生プロパティを再設定しようとしています。最大の煩わしさはコレクションです。ListCollectionView にバインドする複数のコンボ ボックス コントロールがあり、SelectedItem を表すビュー モデルに追加のプロパティがあります。コレクションをリセットするとき、プロセスがコレクションを含むすべてのプロパティを再開できるようにしていました。コレクションを変更すると、選択したプロパティも変更しようとします。これに関する問題は、選択したプロパティを変更すると、バッキングエンティティが新しい値で更新され (ユーザーが項目を選択したかのように)、技術的に値を取り戻すことができないことです。
私が保存していたとき、私は実際に逆の問題を抱えていました。保存後、フォームは非編集モードになり、値は古い値に設定されます。編集中にフォームを再度開くと、正しい値が読み込まれます。これを修正するために、フォームに IsSynchronizedWithCurrentItem=true を追加しました。しかし今、編集中に値が古い値に戻るという逆の問題が発生しています。
// View Code
<ComboBox Grid.Row="1"
Grid.Column="2"
ItemTemplate="{StaticResource TransformerTypeDisplayDataTemplate}"
ItemsSource="{Binding Path=TransformerTypeCollection}"
SelectedItem="{Binding Path=SelectedTransformerType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True"
Style="{StaticResource AssetViewStateAwareComboBox}" Margin="0,0,0,2" VerticalAlignment="Bottom" />
//ViewModel Properties
private ListCollectionView<TransformerType> _transformerTypeCollection;
public ListCollectionView<TransformerType> TransformerTypeCollection
{
get { return _transformerTypeCollection; }
set { _transformerTypeCollection = value; RaisePropertyChanged("TransformerTypeCollection"); }
}
private TransformerType _selectedTransformerType;
public TransformerType SelectedTransformerType
{
get
{
return _selectedTransformerType;
}
set
{
_selectedTransformerType = value;
if (IsInEditMode)
{
BackingEntity.TransformerTypeID = _selectedTransformerType.ID;
BackingEntity.TransformerType = _selectedTransformerType;
}
RaisePropertyChanged("SelectedTransformerType");
}
}
// Setting the collection will trigger the set method for SelectedTransformerType
TransformerTypeCollection = TaskCoordinator.TransformerTypes.GetView();
この問題に対する私の現在の回避策は、コレクションが既に作成されていることを示す状態変数を保持することです。また、ビューモデルの再セットアップ時にコレクションのリセットをスキップします。