我有一个雇主组合。选择雇主后,表格中会填入特定于雇主的数据:
<ComboBox Name="EmployerListBox"
IsReadOnly="True"
ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}"
Width="150" />
下面是它绑定到的属性和检查表是否脏的方法。如果表是脏的,则提示用户如果他们改变雇主,改变将丢失:
/// <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;
}
一切似乎都正常工作:
然而,在GUI中,雇主选项更改为用户选择的雇主(“MPC”),即使选择的雇主没有更改。
当我窥探组合框时,我看到组合框选定项正确设置为原始雇主(“KMH”),但“选定值”和“选择框项”都设置为新雇主(“MPC”)。
然后我试着绑定组合框-
<ComboBox Name="EmployerListBox"
IsReadOnly="True"
ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
SelectedValue="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}"
Width="150" />
GUI是相同的,显示的公司不正确。但这次Snoop展示了ComboBox-
如何正确绑定SelectedEmployer,使GUI与选择的雇主匹配?
所发生的是组合框更改其选择,绑定更新视图模型,然后视图模型选择不更改其私有字段。但是,组合框应该如何知道更改被拒绝?你没有告诉我。
您可能会认为SelectedEmployer.set
可以在决定保留旧值后简单地为选择雇主
提高属性更改
,但我无法使其工作。
执行此操作的“正确”方法是验证:让您的视图模型实现 IDataErrorInfo。这是一个教程,这是另一篇文章。通过验证,您的 IDataErrorInfo.this[propName].get
方法会在 ComboBox
接受新选择之前被调用,并被赋予拒绝新选择的选项。这就是你要找的。如果你不想要红色轮廓错误UI的东西,你可以摆弄模板来摆脱它。
尝试处理 SelectionChanged 很诱人,但事件参数没有 Cancel
,因此您将 SelectedItem
设置回原来的状态,这会再次引发 SelectionChanged
,因此您需要一些逻辑来阻止它无限递归。修复此问题后,由于初始选择完成,在将其设置回以前的值之前,仍然会出现可见的“闪烁”。就我个人而言,我更喜欢实现
IDataErrorInfo
的温和苦差事,而不是试图超越框架。
这是我第一个想法的一个有点笨拙的变体,实际上有效。但是,它有同样的闪烁问题。远非理想,但它比验证工作少得多。DispatcherPriority.ApplicationIdle
是让它工作的原因:它等待实际执行 lambda,直到 ComboBox
中的选择更改事件的所有尘埃落定。DispatcherPriority.Background
也对我有用。
如何在Angular 2应用程序中路由而不更改URL?(这是因为该应用程序位于Django应用程序页面上的几个选项卡之一下,其中适合保持URL不变。 目前我在里面有这样的东西 在<code>HomeComponent</code>中,用户页面的导航使用以下内容: 当我在Angular 2应用程序中导航时,可以保持网址不变吗?所以当用户在页面< code>user/123时,url将保持< code
问题内容: 我需要在 不更改URL的情况下 进行路由。 在自己实现此功能之前,我尝试过通过React Router寻找一些东西。我看到有这样一个东西 : createMemoryHistory([options]) createMemoryHistory创建一个不与浏览器URL交互的内存历史对象。当您需要自定义用于服务器端呈现,自动测试的历史记录对象或不想操纵浏览器URL(例如,将应用程序嵌入到i
我试图将文本字段“Colorbox0”的背景色更改为“Value0”,但它去掉了边框。 以下是我代码的简化版本: 非常感谢您的帮助 谢谢
我有一个动作执行,其中一个if/fe是如果用户按“A”键,它会将文本设置为不同的内容。程序不是在按“A”后设置文本,而是跳过设置文本并向下移动到下面的if语句。我的问题是,如何让我的程序在我的if语句之前设置文本?我的代码在下面,谢谢!
我有一堆CSV文件,它们是作为数据流读取的。对于每个dataframe,我希望更改一些列名,如果某个dataframe中存在特定列: column_name_update_map={'aa':'xx';'bb':'yy'}
问题内容: 我想在字体为时使用光标。 那可能吗? 问题答案: 您可以定制一个。