在 WPF 中,从 ComboBox 中选择(用鼠标)一个“空”值似乎是不可能的。 编辑 澄清一下,这是 .NET 3.5 SP1。

这是一些代码来显示我的意思。首先,C#声明:

public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public string Name { get; set; }
}

接下来,我的 Window1 XAML:
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <ComboBox x:Name="bars"
                  DisplayMemberPath="Name"
                  Height="21"
                  SelectedItem="{Binding Bar}"
                  />
    </StackPanel>
</Window>

最后,我的 Window1 类:
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        bars.ItemsSource = new ObservableCollection<Bar>
        {
            null,
            new Bar { Name = "Hello" },
            new Bar { Name = "World" }
        };
        this.DataContext = new Foo();
    }
}

与我一起?我有一个 ComboBox,它的项目绑定(bind)到一个 Bar 实例列表,其中一个为空。我已将窗口绑定(bind)到 Foo 实例,并且 ComboBox 显示其 Bar 属性的值。

当我运行此应用程序时,ComboBox 以空显示开始,因为 Foo.Bar 默认为空。没关系。如果我使用鼠标将 ComboBox 放下并选择“Hello”项目,那也可以。但是,如果我尝试重新选择列表顶部的空项目,ComboBox 将关闭并返回其先前的值“Hello”!

使用箭头键选择空值可以按预期工作,并且以编程方式设置它也可以。它只是用鼠标选择不起作用。

我知道一个简单的解决方法是让 Bar 的实例代表 null 并通过 IValueConverter 运行它,但是有人可以解释为什么在 WPF 的 ComboBox 中用鼠标选择 null 不起作用吗?

最佳答案

键盘根本没有选择空“项目”——而是取消选择前一个项目,并且没有(能够)选择后续项目。 这就是为什么在用键盘“选择”空项目后,您无法重新选择之前选择的项目(“你好”)——除非通过鼠标!

简而言之,您既不能选择也不能取消选择 ComboBox 中的空项目。当您认为这样做时,您实际上是在取消选择或选择上一个或新项目。

这可能最好通过为 ComboBox 中的项目添加背景来体现。当您选择“Hello”时,您会注意到 ComboBox 中的彩色背景,但是当您通过键盘取消选择它时,背景颜色消失。我们知道这不是空项,因为当我们通过鼠标下拉列表时,空项实际上具有背景颜色!

从原始问题中修改而来的以下 XAML 将在项目后面放置一个浅蓝色背景,以便您可以看到此行为。

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <ComboBox x:Name="bars" Height="21" SelectedItem="{Binding Bar}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="LightBlue" Width="200" Height="20">
                        <TextBlock Text="{Binding Name}" />
                    </Grid>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </StackPanel>
</Window>

如果您想要进一步验证,您可以处理 ComboBox 上的 SelectionChanged 事件,并看到“选择空项”实际上在它的 SelectionChangedEventArgs 中给出了一个空的 AddItems 数组,并“通过用鼠标选择“Hello”来取消选择空项”给出一个 RemovedItems 的空数组。

关于wpf - 为什么我不能在 ComboBox 中选择空值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/518579/

10-17 01:05