- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个雇主组合框。选择雇主后,表格中会填充雇主特定数据:
<ComboBox Name="EmployerListBox"
IsReadOnly="True"
ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}"
Width="150" />
这是它绑定(bind)的属性和一个检查表是否脏的方法。如果表是脏的,则提示用户如果更改 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;
}
一切似乎都正常工作:
但在 GUI 中,雇主选项更改为用户选择的雇主(“MPC”),即使 SelectedEmployer 没有更改。
当我窥探 ComboBox 时,我发现 ComboBox SelectedItem 已正确设置为原始雇主(“KMH”),但 SelectedValue 和 SelectionBoxItem 都设置为新雇主(“MPC”)。
然后我尝试将 ComboBox->SelectedValue 绑定(bind)到 SelectedEmployer:
<ComboBox Name="EmployerListBox"
IsReadOnly="True"
ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
SelectedValue="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}"
Width="150" />
而且 GUI 是一样的,显示的是不正确的公司。但这次 Snoop 显示 ComboBox->SelectedValue 已正确设置为原始雇主('KMH'),但 SelectedItem 和 SelectionBoxItem 都设置为新雇主('MPC')。
如何正确绑定(bind) SelectedEmployer 以便 GUI 与选定的雇主相匹配?
最佳答案
发生的事情是 ComboBox 更改其选择,Binding 更新您的 View 模型,然后 View 模型选择不更改其私有(private)字段。但是 ComboBox 怎么知道更改被拒绝了呢?你没有告诉它。
您可能认为 SelectedEmployer.set
可以在决定保留旧值后简单地为 SelectedEmployer
提高 PropertyChanged
,但我无法理解那个工作。
执行此操作的“正确”方法是进行验证:让您的 View 模型实现 IDataErrorInfo . Here's a tutorial , 和 here's another article .通过验证,您的 IDataErrorInfo.this[propName].get
方法在 ComboBox
接受新选择之前被调用,并被赋予选项拒绝新的选择。这就是您要找的。如果您不想要红色轮廓错误 UI 的东西,您可以摆弄模板来摆脱它。
尝试处理 SelectionChanged
很诱人,但事件参数没有 Cancel
,所以您无法设置 SelectedItem
回到原来的状态,这会再次引发 SelectionChanged
,因此您需要一些逻辑来阻止它无限递归。修复该问题后,由于初始选择在您将其设置回之前的值之前完成,因此仍然会出现可见的“闪烁”。就个人而言,我更喜欢实现 IDataErrorInfo
的温和苦差事,而不是试图超越框架。
Here's a kinda-kludgey variant of my first idea that actually works .但是,它有同样的闪烁问题。远非理想,但它比验证工作少得多。 DispatcherPriority.ApplicationIdle
是它工作的原因:它等待实际执行 lambda,直到所有来自 ComboBox
的选择更改事件内容尘埃落定。 DispatcherPriority.Background
也适用于我。
关于c# - WPF ComboBox 在不应该更改的时候更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38124864/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个包含一些数据的网格(用户列表)。对于每一行,我有许多操作,例如更新、删除、激活、暂停、查看您命名的订单。 而不是放置如此多的按钮,这些按钮将填充超过 400-500像素 我想放置一个组合框,其
在我的一个对话框中,我有以下控制: 我在其他地方填充 ComboBox,如下所示: 但是,如果我没有创建 ComboBox 位,MSI 仍将构
我在项目中为 MVC 使用了 kendo complete。 我有某些形式的国家/地区列表,我显示国家/地区名称,但存储国家/地区代码。 我有以下问题:当用户输入不在列表中的内容时,该值将发送到服务器
我有一个组合框,其中的值是从托管 bean 填充的,如下所示: keywordlist.setConnDB("jdbc:sqlserver://xx.xx.x.xx:1433;DatabaseName
我有一个 ComboBox,它绑定(bind)到 ViewModel 中的复杂类型集合,这些类型的长度可以是任意数量,具体取决于用户的偏好。 我已经创建了一个基于 ComboBox 默认值的样式,并且
我做了一个转换器: public class BooleanToDateConverter implements Converter { private static final long s
编辑:由于 Rob 的回答,我已经更新了下面的代码,现在它可以工作了。 我找到了几页显示如何执行此操作的页面( http://www.cmcrossroads.com/content/view/131
我是 PyQT 的新手。 我有兴趣向 tableView 的每一行添加一个组合框。在 PyQT 4 中可能吗? 我知道,在 QT5 中是可能的,但不确定 PyQT。 预先感谢您的帮助。 最佳答案 如果
我对 JavaFX(8)、HBox、ComboBox 和 HGrow 有问题。 HGrow 不能与 ComboBox 结合使用。 (信息:使用 TextField (而不是 ComboBox),它按预
我有一个 XAML UserControl连接到 ImportPresenter View 模型。有四个ComboBox我的 XAML 中的项目: CashActivityTypeBAI CashAc
我将两个组合框绑定(bind)到同一个 listviewcollection。问题是在一个组合框中选择一个值会导致另一个组合框选定项更改为第一个组合框的确切值。它们是耦合的,我希望它们彼此独立。 My
我正在尝试在 extjs 3.4 中的组合框中的选项之间添加一行。我可以添加该行,但不能用我的远程位置的数据填充它。 (如果我删除修改的 tpl 选项,它就会填充)。 这是我的代码。我只需要在“组”字
我被 WIX 安装程序中的组合框和自定义操作困住了。 我有一个包含几个值的组合框(下拉菜单)。当用户从此下拉列表中选择一个值时,我想在屏幕上显示一些文本(对于下拉列表中的每个项目都是唯一的)。 在 .
我有 ComboBox cbx 和一个包含选项卡的 TabPane(选项卡:t)和一个按钮 b1。因此,单击此按钮 b1 时,它会在 TabPane 中添加一个新选项卡 t,并在包含以下内容的 Com
我有两个组合框:水果和饮料。 fruits 具有字符串:“apple”、“orange”、“banana” drinks 具有字符串:“water”、“coffee”、“juice” 如何制作一个新组
我必须监听什么事件,以便在用户从(可编辑的)WPF ComboBox control 中选择一个选项时得到通知? 我是否必须先访问 Items 属性才能收听 Items.CurrentChanged?
我有以下简单的 QML 组合框: import QtQuick 2.0 import QtQuick.Controls 1.4 import si.mikroelektronika 1.0 Item
当我创建组合框时,列表中没有项目。现在,当我单击下拉按钮时,会调用一个函数(通过 postcommand 选项),但是一旦在我的函数中,我不知道如何在组合框的列表框中设置值。 代码如下: #u
我有两个组合框 我使用 LINQ-to-Entities 来填充 cmbGroup 组合框 Dim db as myDataEntity cmbGroup.ItemsSource = db.Mak
我是一名优秀的程序员,十分优秀!