(問題修正,更清晰)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進行修改。但我不知道如何推遲組合框更新,直到對話框退出。
這是什麼樣子,如果我嘗試不調用該OnPropertyChanged
從EditBonus()
回國後編輯列表(注意空組合框): 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()方法。現在我想知道解決這個問題的最佳方法...
這是什麼問題?您是否無法在清除列表後,在UI上選擇SelectedBonus? – ethicallogics
在EditBonus內部,在調用UpdateBonuses()(清除並重建獎勵列表)後,我可以清楚地看到綁定屬性Bonuses和SelectedBonus具有有效值。但是,除非添加一個額外的OnPropertyChanged方法,否則調用window.ShowDialog()會清除UI上的控件。 –