调用“编辑”对话框时,WPF组合框所选项目将消失
本文关键字:选项 项目 消失 组合 WPF 编辑 对话框 调用 | 更新日期: 2023-09-27 18:00:33
(修改问题以提高清晰度)
我研究了一整天,没有什么能真正解决我的问题。我有一个组合框,它的来源是一个有名称和代码的"奖金"集合。
<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调用的注释,则问题似乎已修复。但是,我不明白为什么会这样,而且有一种情况我无法修复,即对话框的Save操作中的异常会使组合框再次消失。
/// <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
类型和模式,但没有什么不同。
我认为这与访问对话框时数据上下文的更改有关,但仍在修改组合框的itemSource。但我不确定如何将组合框更新推迟到对话框退出。
如果我在从EditBonus()
返回后尝试编辑列表而不调用该OnPropertyChanged
(注意空的组合框),则会出现这种情况:https://www.flickr.com/photos/mav_2007/14035815226/in/set-72157644402662271
如果我刚从EditBonus()
回来就打电话,情况就是这样:我很想向你展示这一点,但我想我还不够"有信誉":(你可以在我的Flickr页面上看到这个问题的所有图片)
谢谢你能给的任何帮助
附加信息(已确定可能的罪魁祸首):
SelectedBonus的DataContext是BehaviorViewModel,但BonusEditViewModel中还有另一个SelectedBonusProperty。BehaviorViewModel和BonusEditViewModel都派生自ViewModelBase,OnPropertyChanged处理程序在ViewModelBase中实际执行基于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()方法。现在我想知道解决这个问题的最佳方法。。。
问题已被验证为与代码结构有关,该代码绑定到名为BehaviorViewModel的ViewModel类中的属性SelectedBonus。但是,该类中的属性实际上是从ViewModel类中名为BonusEditViewModel的属性获取数据的。在BonusEditViewModel类内部调用"OnPropertyChanged("SelectedBonus")对BehaviorViewModel中绑定的属性没有影响。需要重新构造代码,以便BehaviorView Model中的SelectedBonus属性不会引用另一个ViewModel中的属性。这只是结构不好的代码。