5

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

在上述场景中,由于第二个屏幕绑定到第一个屏幕上的 Selected 项,因此 City 的 SelectedValue 为“Los Angeles”,Display 为 Empty。但由于集合中不存在“Los Angeles”,因此 SelectedValue 应该为 null。

4

2 回答 2

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));
        }
    }
于 2013-04-22T13:46:32.520 回答
0

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

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

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

你可以在这里阅读更多关于转换器的信息:

http://wpftutorial.net/ValueConverters.html

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

编辑:

我玩了一些代码示例,并注册了组合框中的选择更改事件。this event is only triggered if the source for the selection item yields a selection which is valid for the combo box. 所以现在我回到我原来的建议应该可行:在转换器中,根据组合框项的所有值的列表检查传入的值。如果它不存在,转换器需要让组合知道它应该将其选定项设置为空。虽然我确信有更简单和优雅的方法可以做到这一点(我不是 WPF 专家),但这应该可以解决问题。

关于如何将转换器与控件挂钩的另一条线索是使用多重绑定:

WPF 转换器可以访问它所绑定的控件吗?

于 2013-04-22T13:30:46.653 回答