如果itemsource中不存在值,则Combobox指定null

时间:2013-04-22 12:52:09

标签: c# wpf data-binding combobox mvvm-light

我有一个Datagrid,双击所选行后,将启动一个编辑屏幕。 在此编辑屏幕上,有组合框,其值绑定到网格中的选定行。 有时,组合框中没有分配给组合框的值,因此组合框中的显示为空,但该值不为空。 如果itemsource集合中不存在该值,如何更新所选项目的值为null。

在上面的场景中,由于第二个屏幕绑定到第一个屏幕上的Selected项目,City的SelectedValue为“洛杉矶”,显示为空。 但由于集合中不存在“洛杉矶”,因此SelectedValue应为null。

2 个答案:

答案 0 :(得分:1)

解决方案是将组合框的 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));
        }
    }

答案 1 :(得分:0)

转换器用于转换绑定中的数据 达到预期的效果。 (允许在源和目标之间匹配不兼容的类型。)

关于组合框和项目源之间使用的转换器的类似问题在这里:

Use converter on bound items in combobox

你可以在这里阅读更多的转换器:

http://wpftutorial.net/ValueConverters.html

在这种情况下,转换器应放在组合的selectedItem属性上。

修改

我玩了一些代码示例,并在组合框中注册了选择更改事件。仅当选择项的源产生对组合框有效的选择时,才会触发此事件。 所以现在我回到原来的建议应该有用: 在转换器中,根据组合框项目的所有值列表检查传入值。 如果它不存在,转换器需要让组合知道它应该将其选定项设置为null。虽然我确信有更简单而优雅的方法(我不是WPF专家),但这应该可以解决问题。

如何将转换器与控件挂钩的另一个方法是使用多重绑定:

Can a WPF converter access the control to which it is bound?