当绑定到“ SelectedItem”时,如何使Combobox设置null值?

时间:2018-10-23 12:33:33

标签: c# wpf

我有一个组合框,我将在开头添加一个<x:Null/>,因为'null'是绑定属性的完全有效值,但是WPF似乎不愿意设置它。这是XAML:

<ComboBox SelectedItem="{Binding PropertyName}">
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <x:Null/>
            <CollectionContainer Collection="{Binding (available items)}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name, FallbackValue='(None)'}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

(available items)中的集合具有带有Name属性的对象。当(None)的当前值为null时,组合框会正确显示PropertyName,并且当我选择一个时,它会设置为集合中的一项,但是当我选择(None)时,它不会将属性设置为null。我有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

我最近遇到了这个问题...一种解决方法是拥有一个可以显示空值属性的视图模型:

public class ListItemValue<T>
{
   public ListItemValue(string name, T value)
   {
      Name = name;
      Value = value;
   }

   public string Name { get; }

   public T Value { get; }
}

答案 1 :(得分:0)

用实际的实例替换<x:Null>并使用转换器:

public class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => value;

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
        value is short ? null : value;
}

XAML:

<ComboBox>
    <ComboBox.SelectedItem>
        <Binding Path="PropertyName">
            <Binding.Converter>
                <local:Converter />
            </Binding.Converter>
        </Binding>
    </ComboBox.SelectedItem>
    <ComboBox.ItemsSource>
        <CompositeCollection xmlns:sys="clr-namespace:System;assembly=mscorlib">
            <sys:Int16 />
            <CollectionContainer Collection="{Binding Source={StaticResource items}}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name, FallbackValue='(None)'}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>