在 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/