2012-10-04 97 views
1

我有一個組合框的SelectedItem屬性綁定到一個對象的字段。它使用TwoWay綁定,在大多數情況下工作正常;當它加載了,下拉的選擇是從外地的吸氣設定,手動更改選擇調用該領域的引領者。WPF組合框 - 在綁定字段的setter改變選擇 - 組合框選擇不更新

但是,有時我想顯示一個確認對話框。如果用戶點擊「否」,我希望該值保持不變。這裏是我的代碼:

public A Afield 
{ 
    get { return _afield; } 
    set 
    { 
     SetA(value); 
    } 
} 
public void SetA(LocationConfiguration value, bool prompt = true) 
{ 
    if (/*selection would cause irreversible changes*/) 
    { 
     if (prompt) 
     { 
      MessageBoxResult result = Microsoft.Windows.Controls.MessageBox.Show(
        "bla bla bla", 
        "bla", 
        MessageBoxButton.YesNo, 
        MessageBoxImage.Warning); 
      if (result != MessageBoxResult.Yes) 
       return; 
     } 
     PerformIrreversibleChanges() 
    } 
    _afield = value; 
    NotifyPropertyChanged("Afield"); 
} 

代碼隱藏的一切工作完美。如果用戶接受,則進行更改。如果用戶按下「否​​」,則_afield不被修改。綁定到此屬性的其他控件顯示正確的值。

然而,在組合框顯示不恢復到_afield的值。即使他們拒絕了變更,它仍然保留他們所選的內容。出於某種原因,它似乎沒有設置組合框的項目,直到屬性設置完成。此時它會顯示用戶選擇的內容,而不是保留在代碼隱藏中的正確值。

回答

0

您需要設置回因爲雙向綁定你的財產將得到儘快的選擇更改,因此你需要,如果用戶取消改變其重置爲上一個值更新。您可以查看事件參數的RemovedItems屬性以獲取以前的值。

+0

定義了setter,如果用戶取消該屬性,屬性永遠不會被設置。但由於某些原因,即使屬性保持正確的值,組合框仍顯示用戶嘗試選擇的值。 – hypehuman

0

我設法解決這個問題,但解決的辦法是不漂亮。除了綁定,我現在有一個SelectionChanged事件改變選擇回不管它應該是一個處理程序。下面的代碼:

private void cbox_Abox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    foreach (ComboBoxItem cbi in cbox_Abox.Items) 
     if ((string)cbi.Content == BoundObject.Afield.ToString()) 
      cbox_Abox.SelectedItem = cbi; 
} 

現在,每當我手動選擇組合框的值,它的價值通過綁定(就像它之前),然後,使用此處理程序,它會將值回了寫入對象的對象放入ComboBox中。

出於某種原因,使用PropertyChanged事件在此不更新組合框,這就是爲什麼我必須顯式調用ComboBox.SelectedIndex。

0

有無組A返回一個布爾

set 
{ 
    if (value == _afield) return;   
    if (SetA(value)) _afield = value; 
    NotifyPropertyChanged("Afield"); 
} 
+0

這不起作用:( – hypehuman

+0

我認爲這可能是因爲組合框中選定的項目沒有設置,直到setter完成後,並且在setter期間調用NotifyProperty。 – hypehuman

+0

@hypehuman我同意 – Paparazzi

0

或者,你可以保存先前的值,並保持它作爲後備如果用戶因爲我有辦法壓制「NO」

private A previousAfield; 
public A Afield 
{ 
    get { return _afield; } 
    set 
    { 
     previousAfield = _afield; 
     SetA(value); 
    } 
} 
+0

我不認爲我解釋了我的問題非常好。我並不需要存儲一個備用的,因爲_afield並最終有我想要的價值,問題是,組合框不顯示值,這就是爲什麼我要專門設置的SelectedIndex。 – hypehuman

+0

最後給它cbx.SelectedItem = _previousAField –