C# WPF组合框SelectedItem在调用编辑对话框时消失
为更清晰起见,对问题进行了修改 我已经研究了一整天,没有什么能真正解决我的问题。我有一个组合框,它的源代码来自一个有名称和代码的奖金集合C# WPF组合框SelectedItem在调用编辑对话框时消失,c#,wpf,binding,combobox,C#,Wpf,Binding,Combobox,为更清晰起见,对问题进行了修改 我已经研究了一整天,没有什么能真正解决我的问题。我有一个组合框,它的源代码来自一个有名称和代码的奖金集合 <ComboBox Margin="4" SelectedItem="{Binding Path=SelectedBonus, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Path=Bonuses, UpdateSourceTrigger=Explicit}
<ComboBox Margin="4"
SelectedItem="{Binding Path=SelectedBonus, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=Bonuses, UpdateSourceTrigger=Explicit}"
DisplayMemberPath="Name"
IsSynchronizedWithCurrentItem="True">
方法如下:
现在,我已经尝试更改UpdateSourceTrigger类型和模式,但没有任何改变
我相信这与访问对话框时更改datacontext有关,但仍在修改combobox的itemSource。但我不确定如何推迟组合框更新,直到对话框退出
从EditBonus note返回空组合框后,如果我尝试编辑列表而不调用OnPropertyChanged,则会出现这种情况:
这就是我从EditBonus回来后打电话的样子:
我很想向你们展示这一点,但我想我的声誉还不够好:你们可以从那个链接在我的Flickr页面上看到这个问题的所有图片
谢谢你能给我的帮助
其他信息可能是已查明的罪魁祸首:
SelectedBonus的DataContext是BehaviorViewModel,但在BonusEditViewModel中还有另一个SelectedBonuProperty。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对象上的方法UpdateBuuses。现在我想知道解决这个问题的最好方法 经验证,问题出在代码结构上,该代码绑定到名为BehaviorViewModel的ViewModel类中的SelectedBonus属性。但是,此类中的属性实际上从ViewModel类中名为BonusEditViewModel的属性获取数据。在BonusEditViewModel类内调用OnPropertyChangedSelectedBonus对BehaviorViewModel中的属性绑定没有影响。代码需要重新构造,以便BehaviorViewModel中的SelectedBonus属性不会引用另一个ViewModel中的属性。这只是一个结构糟糕的代码。问题出在哪里?是因为您无法在清除列表后在UI上将SelectedBonus设置回SelectedBonus。有点像。在EditBonus内部,调用UpdateBunus(清除并重建奖金列表)后,我可以清楚地看到绑定属性bonus和SelectedBonus具有有效值。但是,调用window.ShowDialog会清除UI上的控件,除非我添加了一个额外的OnPropertyChanged方法。
/// <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");
}
}
/// <summary>
/// The currently selected bonus which will be edited by the dialog
/// </summary>
public Bonus SelectedBonus
{
get { return selectedBonus; }
set
{
selectedBonus = value;
OnPropertyChanged("SelectedBonus");
}
}