如果 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的主要内容,如果未能解决你的问题,请参考以下文章

如果列表sql server中不存在数据,则返回值

Puppet - 在迭代哈希时,如果hiera中不存在,则设置清单中的默认值

ExtJs 组合框分页工具栏属性

如果javascript中不存在值,如何推送到多维数组

如果C#中不存在则插入[重复]

如果行中不存在所有值,则插入记录[重复]