如果在项目源中没有找到该值,Combobox 将赋空值。

5
我有一个数据网格,双击选定的行后会启动编辑屏幕。在此编辑屏幕上,存在下拉列表框,其值绑定到网格中选定的行。 有时,分配给下拉列表框的值不存在于下拉列表框项目源中,因此下拉列表框上的显示为空,但该值不为 null。 如何更新所选项的值,以使其在项目源集合中不存在时为 null?
在上述情况下,由于第二个屏幕绑定到第一个屏幕上选择的项,因此 "City" 的 SelectedValue 是 "Los Angeles" 而 Display 为空。 但是,由于 "Los Angeles" 不存在于集合中,SelectedValue 应为 null。

你尝试过使用转换器吗? - omer schleifer
还没有尝试过。转换器应该做什么? - xaria
2个回答

1
一个解决方案是将组合框的ItemsSource设置为列表(example: "DeviceNameList"),并将此组合框的SelectedItem设置为与您列表内元素类型匹配的变量(SelectedDeviceName)。
现在当您加载编辑屏幕时,它会将列表绑定到组合框并显示您设置的变量。
您需要编写一些代码来检查所选项是否出现在列表中,如果没有,可以将值设置为零。 示例: XAML 代码:
<ComboBox ItemsSource="{Binding Path=DeviceNameList}" SelectedItem="{Binding Path=SelectedDeviceName}" />

设置选定项的代码:

    /// <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,谢谢,但是这部分我已经弄清楚了。我想知道如何检查所选值是否存在于集合中的部分。 - xaria
我建议使用类似于“foreach”的方法遍历列表,然后当当前项不等于列表中的某个值时,将其赋值为零。 - Enrico

0

转换器用于将绑定中的数据转换为所需的结果。(允许在源和目标之间匹配不兼容的类型)。

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

在组合框中使用转换器绑定项

您可以在此处阅读有关转换器的更多信息:

http://wpftutorial.net/ValueConverters.html

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

编辑:

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

另一个关于如何将转换器与控件连接的线索是使用多绑定:

{{link1:WPF转换器可以访问其绑定的控件吗?}}


我不明白ValueConverter在这里如何有帮助。您能否详细说明一下? - DHN
我认为在这里使用转换器不会起作用。如果在itemsSource集合中不存在所选值,我想将其设置为null。 - xaria
也许我误解了你的问题。但是如果你绑定了你选择的项目,那么你可以使用转换器来检查新传入的值是否存在于控件当前的值中。如果是-使用它。否则-将其设置为null。 - omer schleifer
@xaria,你能听懂这个吗? - omer schleifer
@omerschleifer 不,它也没有帮助 - xaria
@xaria,我已经编辑了我的答案。我相当确定它应该可以工作,虽然我承认它不是很干净。 - omer schleifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接