2014-04-29 67 views
0

(問題修正,更清晰)WPF組合框的SelectedItem消失時,編輯對話框調用

我一直在研究了一整天,沒有真正清除了我的問題。我有一個組合框,它從一個名稱和一個代碼的「獎金」集合中獲取它的來源。

<ComboBox Margin="4" 
    SelectedItem="{Binding Path=SelectedBonus, UpdateSourceTrigger=PropertyChanged}" 
    ItemsSource="{Binding Path=Bonuses, UpdateSourceTrigger=Explicit}" 
    DisplayMemberPath="Name" 
    IsSynchronizedWithCurrentItem="True"> 

「獎金」是最初從文件中檢索的集合。組合框已正確填充集合,並且我可以選擇列表中的任何項目。

不能發佈圖片,所以這裏是鏈接到加載列表啓動:https://www.flickr.com/photos/mav_2007/14059399414/in/set-72157644402662271

現在,下面的代碼被稱爲上下文切換(右鍵單擊組合框,然後選擇「編輯獎金「)。但是,這裏是我無法理解WPF和綁定發生了什麼的情況。

在下面的代碼中,名爲「EditBonus」的方法重置組合框,重新讀取文件以確保沒有任何變化(Bonuses.Clear()被調用,然後重新構建,SelectedItem被設置)。但是,只要我調用ShowDialog,組合框選定的項目就會變爲空白。如果我對下面的OnPropertyChanged調用取消註釋,則問題似乎已解決。但是,我不明白爲什麼會這樣,而且有一種情況我無法解決,對話框的保存操作中的異常使組合框再次消失。

/// <summary> 
    /// Handle the "edit bonus" command 
    /// </summary> 
    void OnEditBonus() 
    { 
     // only edit this is we have a bonus selected 
     if (bonusEditViewModel.EditBonus()) 
     { 
      // OnPropertyChanged("SelectedBonus"); 
      var window = new BonusEditDialog(bonusEditViewModel); 
      window.ShowDialog(); 
      // OnPropertyChanged("SelectedBonus"); 

     } 
    } 

而且方法EditBonus()

internal bool EditBonus() 
    { 
     bool success = false; 

     if (SelectedBonus != null) 
     { 
      var originalCode = SelectedBonus.Code; 
      success = UpdateBonuses(originalCode); 
      if (success) 
      { 
       if (SelectedBonus.Code == originalCode) 
       { 
        BonusName = SelectedBonus.Type; 
        originalBonusName = BonusName; 
        CloseWindow = false; 
       } 
      } 
     } 
     return success; 
    } 

現在,我已經試圖改變UpdateSourceTrigger類型和模式並沒有什麼有差別。

我相信它與訪問對話框時改變datacontext有關,但仍然對組合框的itemSource進行修改。但我不知道如何推遲組合框更新,直到對話框退出。

這是什麼樣子,如果我嘗試不調用該OnPropertyChangedEditBonus()回國後編輯列表(注意空組合框): https://www.flickr.com/photos/mav_2007/14035815226/in/set-72157644402662271

這是什麼樣子,如果我打這個電話從EditBonus()返回: 我很想向你展示這一點,但我想我不是「有信譽的」足夠:(:(你可以從我的Flickr頁面上看到這個問題的所有圖像)

感謝您給予的任何幫助

附加信息(可能的罪魁禍首確定):

SelectedBonus的DataContext是BehaviorViewModel,但BonusEditViewModel中還有另一個SelectedBonusProperty。 BehaviorViewModel和BonusEditViewModel派生自ViewModelBase,它是OnPropertyChanged處理程序基於ViewModel類型實際執行處理程序的位置。 BehaviorViewModel是綁定到窗體的東西。在BonusEditViewModel中調用OnPropertyChanged沒有效果,因爲它是不同的上下文。

這裏是內部BehaviorViewMode的SelectedBonus屬性:

/// <summary> 
    /// Expose the bonus information from the bonusEditViewModel 
    /// </summary> 
    public Bonus SelectedBonus 
    { 
     get 
     { 
      return bonusEditViewModel.SelectedBonus; 
     } 
     set 
     { 
      bonusEditViewModel.SelectedBonus = value; 
      if (behavior != null && bonusEditViewModel.SelectedBonus != null) 
      { 
       behavior.Items[BehaviorItem.THEME_ID].Value = bonusEditViewModel.SelectedBonus.Code.ToString(); 
      } 
      if (bonusEditViewModel.SelectedBonus != null) 
      { 
       ThemeShortname = bonusEditViewModel.SelectedBonus.Type; 
      } 
      OnPropertyChanged("SelectedBonus"); 

     } 
    } 

這裏是內部BonusEditViewModel的SelectedBonus代碼:

 /// <summary> 
    /// The currently selected bonus which will be edited by the dialog 
    /// </summary> 
    public Bonus SelectedBonus 
    { 
     get { return selectedBonus; } 
     set 
     { 
      selectedBonus = value; 
      OnPropertyChanged("SelectedBonus"); 
     } 
    } 

功能OnEditBonus()存在BehaviorViewModel內,並呼籲BonusEditViewModel對象上的UpdateBonuses()方法。現在我想知道解決這個問題的最佳方法...

+0

這是什麼問題?您是否無法在清除列表後,在UI上選擇SelectedBonus? – ethicallogics

+0

在EditBonus內部,在調用UpdateBonuses()(清除並重建獎勵列表)後,我可以清楚地看到綁定屬性Bonuses和SelectedBonus具有有效值。但是,除非添加一個額外的OnPropertyChanged方法,否則調用window.ShowDialog()會清除UI上的控件。 –

回答

0

該問題已經通過代碼結構驗證,該代碼的結構與ViewModel類中名爲BehaviorViewModel的SelectedBonus屬性綁定。然而,這個類中的屬性實際上是從ViewModel類中的一個屬性獲取其數據,稱爲BonusEditViewModel。在BonusEditViewModel類中調用「OnPropertyChanged(」SelectedBonus「)對BehaviorViewModel中綁定的屬性沒有影響,需要對代碼進行重構,以便BehaviorViewModel中的SelectedBonus屬性不會引用另一個ViewModel中的屬性。 。