(问题修正,更清晰)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上的控件。 –