gpt4 book ai didi

wpf - 为什么无法在组合框中选择空值?

转载 作者:行者123 更新时间:2023-12-03 07:05:27 26 4
gpt4 key购买 nike

在 WPF 中,似乎不可能从组合框中选择(使用鼠标)“空”值。 编辑澄清一下,这是 .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 实例列表,其中一个为 null。我已将窗口绑定(bind)到 Foo 的实例,并且 ComboBox 正在显示其 Bar 属性的值。

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

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

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

最佳答案

嗯,我最近遇到了同样的问题,ComboBoxnull 值。我通过使用两个转换器解决了这个问题:

  1. 对于 ItemsSource 属性:它将集合中的 null 值替换为转换器参数内传递的任何值:

    class EnumerableNullReplaceConverter : IValueConverter
    {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
    var collection = (IEnumerable)value;

    return
    collection
    .Cast<object>()
    .Select(x => x ?? parameter)
    .ToArray();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
    throw new NotSupportedException();
    }
    }
  2. 对于 SelectedValue 属性:此属性执行相同的操作,但针对单个值并有两种方式:

    class NullReplaceConverter : IValueConverter
    {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
    return value ?? parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
    return value.Equals(parameter) ? null : value;
    }
    }

使用示例:

<ComboBox 
ItemsSource="{Binding MyValues, Converter={StaticResource EnumerableNullReplaceConverter}, ConverterParameter='(Empty)'}"
SelectedValue="{Binding SelectedMyValue, Converter={StaticResource NullReplaceConverter}, ConverterParameter='(Empty)'}"
/>

结果:

enter image description here

注意:如果您绑定(bind)到 ObservableCollection,那么您将丢失更改通知。另外,您不希望集合中存在多个 null 值。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com