如果 itemsource 中不存在值,则组合框分配 null
Posted
技术标签:
【中文标题】如果 itemsource 中不存在值,则组合框分配 null【英文标题】:Combobox assign null if value does not exist in itemsource 【发布时间】:2013-04-15 09:11:16 【问题描述】:我有一个 Datagrid,双击选定的行后,会启动一个编辑屏幕。 在此编辑屏幕上,有组合框,其值绑定到网格中的选定行。 有时,combobox itemSource 中不存在分配给combobox 的值,所以combobox 上显示为空,但该值不为null。 如果 itemsource 集合中不存在该值,如何将所选项目的值更新为 null。
在上述场景中,由于第二个屏幕绑定到第一个屏幕上的 Selected 项目,因此 City 的 SelectedValue 为“Los Angeles”,Display 为 Empty。 但由于集合中不存在“洛杉矶”,因此 SelectedValue 应该为 null。
【问题讨论】:
你试过用转换器吗? 没试过。转换器应该做什么? 【参考方案1】:转换器用于转换绑定中的数据 达到预期的结果。 (允许不兼容的类型在源和目标之间进行匹配)。
关于在组合框和 itemsource 之间使用的转换器的类似问题在这里:
Use converter on bound items in combobox
您可以在这里阅读更多关于转换器的信息:
http://wpftutorial.net/ValueConverters.html
在这种情况下,转换器应该放在组合的 selectedItem 属性上。
编辑:
我玩了一些代码示例,并注册了组合框中的选择更改事件。仅在选择项的源产生对组合框有效的选择时才会触发此事件。 所以现在我回到我原来的建议应该可行: 在转换器中,对照组合框项的所有值列表检查传入值。 如果它不存在,转换器需要让组合知道它应该将其选定项设置为空。虽然我确信有更简单和优雅的方法可以做到这一点(我不是 WPF 专家),但这应该可以解决问题。
关于如何将转换器与控件挂钩的另一条线索是使用多重绑定:
Can a WPF converter access the control to which it is bound?
【讨论】:
我没有看到 ValueConverter 在这里有什么帮助。可以详细说明一下吗? 我不认为转换器可以在这里工作。如果 itemsSource 集合中不存在所选值,我想将其设置为 null 也许我误解了你的问题。但是,如果您绑定所选项目,则可以使用转换器检查新传入值是否存在于控件的当前值中。如果是这样 - 使用它。否则 - 将其设置为 null。 @xaria ,这对你有意义吗? @omerschleifer 不,它也无济于事【参考方案2】:解决方案是将组合框的 ItemsSource 设置为列表(例如:“DeviceNameList”)并将此组合框的 SelectedItem 设置为与列表中的元素类型 (SelectedDeviceName)。
现在,当您加载编辑屏幕时,它会将列表绑定到组合框并显示您设置的变量。
您必须编写一些代码来检查所选项目是否出现在列表中,如果没有,您可以将值设置为零。
示例:
XAML 代码:
<ComboBox ItemsSource="Binding Path=DeviceNameList" SelectedItem="Binding Path=SelectedDeviceName" />
设置 selectedItem 的代码:
/// <summary>
/// Gets or sets SelectedDeviceName.
/// </summary>
public ObservableCollection<string> DeviceNameList
get
return mDeviceNameList;
set
mDeviceNameList = value;
/// <summary>
/// Gets or sets SelectedDeviceName.
/// </summary>
public string SelectedDeviceName
get
return mSelectedDeviceName;
set
mSelectedDeviceName = value;
NotifyPropertyChanged("SelectedDeviceName");
/// <summary>
/// Event PropertyChanged
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Function NotifyPropertyChanged
/// </summary>
/// <param name="property">
/// The property.
/// </param>
private void NotifyPropertyChanged(string property)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
【讨论】:
Enrico,谢谢,但这部分我已经弄清楚了。我想要可以检查集合中是否存在 selectedValue 的部分。 我会建议像 foreach 这样的东西来遍历列表,然后当当前项目不等于列表中的某些内容时,您将其分配为零?以上是关于如果 itemsource 中不存在值,则组合框分配 null的主要内容,如果未能解决你的问题,请参考以下文章