【发布时间】:2016-11-02 15:40:14
【问题描述】:
我有一个雇主组合框。选择雇主后,表格中会填充雇主特定数据:
<ComboBox Name="EmployerListBox"
IsReadOnly="True"
ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}"
Width="150" />
这是它所绑定的属性和一个检查表是否脏的方法。如果表脏了,则提示用户如果更改 Employer,更改将丢失:
/// <summary>
/// Selected Employer
/// </summary>
public String SelectedEmployer
{
get
{
return _SelectedEmployer;
}
set
{
if (_SelectedEmployer != value && CanChangeEmployer())
{
_SelectedEmployer = value;
NotifyPropertyChanged(m => m.SelectedEmployer);
GetGarnishmentsTableView();
}
}
}
private String _SelectedEmployer = "";
/// <summary>
/// Method that executes each time user wants to change employers
/// </summary>
public Boolean CanChangeEmployer()
{
Boolean _returnValue = true;
if (GarnishmentsTableIsDirty)
{
_returnValue = false;
MessageBoxResult _change =
MessageBox.Show("There are unsaved changes. " +
"Changing Employers will lose any unsaved changes. \n\n" +
"Are you sure you want to change Employers?", "Unsaved Changes", MessageBoxButton.YesNo);
if (_change == MessageBoxResult.Yes)
{
// OK to switch employers
_returnValue = true;
}
}
return _returnValue;
}
一切似乎都正常工作:
- 用户选择更新表格的雇主 ('KMH')。
- 用户对表格进行了更改。
- 然后用户选择不同的雇主 ('MPC')
- 提示用户更改将丢失
- 用户选择“否”,CanChangeEmployers 返回“假”
- SelectedEmployer 不会改变(跳过 if {} 块)
然而在 GUI 中,Employer 选项更改为用户选择的 Employer ('MPC'),即使 SelectedEmployer 没有改变。
当我窥探 ComboBox 时,我看到 ComboBox SelectedItem 已正确设置为原始 Employer ('KMH'),但 SelectedValue 和 SelectionBoxItem 都设置为新 Employer ('MPC')。
然后我尝试将 ComboBox->SelectedValue 绑定到 SelectedEmployer:
<ComboBox Name="EmployerListBox"
IsReadOnly="True"
ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
SelectedValue="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}"
Width="150" />
GUI 是相同的,显示的公司不正确。但这次 Snoop 显示 ComboBox->SelectedValue 正确设置为原始 Employer ('KMH'),但 SelectedItem 和 SelectionBoxItem 都设置为新 Employer ('MPC')。
如何正确绑定 SelectedEmployer 以使 GUI 与所选雇主匹配?
【问题讨论】:
-
在 CanChangeEmployer() 返回 false 的情况下尝试调用 NotifyPropertyChanged(...),否则绑定子系统可能会假设 SelectedEmployer 属性实际上已设置为指定的值,而实际上它具有没有更新。
标签: c# wpf combobox selectionchanged