2011-06-29 26 views
3

私のviewModelのcomboBoxロジックに問題があります。 viewModelはcomboBoxに値を設定し、ユーザーはアイテムを選択できます。WPF、MVVM、およびcombobox

アイテムを選択すると、編集可能な情報がビューに表示され、変更できるようになります。さて、変更が加えられて保存されておらず、ドロップダウンで別の項目を選択しようとしている(「保存しますか?はい/いいえ/取り消しメッセージボックス)」というメッセージをユーザに保存するようにしたいと思います。

今は、以前選択したアイテムを覚えておき、ユーザーがキャンセルを選択した場合は、選択したアイテムをリセットすることでこれを処理する必要があります。 comboBoxにはPreviewSelectionChangedイベントがないので、これがこのシナリオを処理するための唯一の方法です。それは動作しますが、それは複数のコンボボックスなどが少し乱雑になります。

これはちょうどそれが行われる必要がある方法ですか?

答えて

0

編集可能アイテムを実際のアイテムではなくアイテムのコピーにするのはどうですか?

PropertyChangeイベントがSelectedComboBoxIndexに発生するたびにだからあなたのViewModelは

ObservableCollection<MyModel> ComboBoxItems; 
int SelectedComboBoxIndex; 
MyModel EditingItem; 

を含んでいるでしょう、あなたがチェックし、EditingItemがnullであるかどうかを参照してください。それはnullであれば、それはあなたがスイッチに安全だとあなたが

EditingItem = ComboBoxItem[SelectedComboBoxIndex]).Copy();

を設定する意味EditingItemがnullでない場合は、ユーザーが変更を保存するか、キャンセルしたい場合、あなたは尋ねるプロンプトを投げます。

ユーザーが[保存]を押すと、EditingItemが適用され、変更がデータストアに適用され、ComboBoxItemsリストの項目が更新されます。

キャンセルを押すと、EditingItemは単に破棄されます。

2

ビューモデルでは基本的に、isDirtyという名前のフラグを設定する必要があります。

public class EditorViewModel 
{ 
    private bool _isDirty = false; 

    private long _editableProperty; 
    public long EditableProperty 
    { 
     get { return _editableProperty; } 
     set 
     { 
      _editableProperty = value; 

      // We've detected a change so mark this view model as dirty. 
      _isDirty = true; 
     } 
    } 
} 

データが実際にオリジナルと異なることを確認したい場合は、さらに多くのフープを実行する必要があります。だから誰かが間違ってEditablePropertyにスペースを追加し、あなたのビューモデルがそれが汚いと思ってユーザーを促すだろうと思ったらそれを削除してください。

1

WindowsフォームコンボボックスはSelectionChangeCommittedイベントを提供しましたが、WPF ComboBoxコントロールでは、選択の変更が発生する前に通知するイベントがないため、イベントをキャンセルする手段が提供されます。

変更追跡/編集可能なアプローチを採用する場合は、コンボボックスアイテムのソースのアイテムにIChangeTrackingIEditableObjectを実装することを検討することをおすすめします。

SelectionChangedイベントを処理する必要があります。removed itemsを調べて、以前に選択したアイテムが変更されているかどうかを確認し、確認を求めるダイアログを表示します。 no/cancelが表示された場合は、選択したインデックスを以前に選択したアイテムのインデックスに戻すことができます。

関連する問題