2011-06-29 144 views
3

我的viewModel中我的組合框邏輯出現問題。 viewModel填充組合框,用戶可以選擇項目。WPF,MVVM和組合框

當一個項目被選中時,一些可編輯的信息出現在視圖中,他們可以進行更改。現在,我想提示用戶保存是否進行了更改並且未保存,並且他們試圖在下拉列表中選擇另一個項目(「Save?」yes/no/cancel messageBox)。

現在我需要記住先前選擇的項目,並通過重置所選項目來處理這個問題,如果用戶選擇取消。由於comboBox沒有PreviewSelectionChanged事件,這是我能想到處理這種情況的唯一方法。它的工作原理,但它有點凌亂hwen有多個comboBoxes等

我錯過了什麼,或者這只是它需要做的方式嗎?

回答

0

如何讓Editable項目成爲項目的副本而不是實際的項目?

所以,你的視圖模型將包含

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

每當PropertyChange事件上SelectedComboBoxIndex發生,你檢查,看看EditingItem爲空或不是。如果是null,這意味着你的安全切換,並設置

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

如果EditingItem不爲空,那麼你就扔了,如果用戶想要保存更改或取消一個提示,詢問。

當用戶點擊保存時,它將採取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組合框控件,您正確的是沒有會在選擇更改發生之前通知的事件,該事件將爲您提供取消事件的方法。

如果您要採取變更追蹤/編輯方式,我建議您考慮在您的組合框項目源中對項目實施IChangeTrackingIEditableObject

您可能必須處理SelectionChanged事件,請檢查removed items以確定先前選擇的項目是否已修改,然後顯示請求確認的對話框。如果未指定/取消,則可以將所選索引設置回先前選擇的項目。