(为了更清晰而修改了问题)
我一整天都在研究,没有什么能真正解决我的问题。我有一个组合框,它从一个具有名称和代码的“奖金”集合中获取。
<ComboBox Margin="4"
SelectedItem="{Binding Path=SelectedBonus, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=Bonuses, UpdateSourceTrigger=Explicit}"
DisplayMemberPath="Name"
IsSynchronizedWithCurrentItem="True">
“Bonuses”是最初从文件中检索的集合。组合框适当地填充了集合,我可以选择列表中的任何项目。
无法发布图片,因此这里是启动时加载列表的链接: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()。现在我想知道解决这个问题的最佳方法......
答案 0 :(得分:0)
该问题被验证为代码结构,该代码结构与ViewModel类中名为BehaviorViewModel的属性SelectedBonus绑定。但是,此类中的属性实际上从ViewModel类中名为BonusEditViewModel的属性获取其数据。在BonusEditViewModel类中调用“OnPropertyChanged(”SelectedBonus“)对BehaviorViewModel中绑定的属性没有影响。代码需要重新构造,以便BehaviorViewModel中的SelectedBonus属性不引用另一个ViewModel中的属性。这只是结构不良的代码