Как получить Combobox для установки значения NULL при привязке к «SelectedItem»?

2

У меня есть поле со списком, с которым я добавляю в начале <x:Null/>, так как 'null' является совершенно допустимым значением для свойства bound, но 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) когда текущее значение PropertyName равно нулю, и оно устанавливает для элемента в коллекции, когда я выбрал его, но когда я выбираю (None), для свойства не устанавливается нулевое значение. Есть ли способ, которым я могу это сделать?

  • 0
    Я не могу допустить, что если PropertyName имеет значение null , то в выпадающем списке выбрано значение (None) . У меня есть (None) запись в выпадающем списке, но она не выбрана.
  • 0
    Возможный дубликат Почему я не могу выбрать нулевое значение в ComboBox?
Теги:
wpf

2 ответа

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>
0

Я недавно столкнулся с этим... Один из способов подойти к этому - иметь модель представления, которая может предоставлять свойство нулевого значения:

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

   public string Name { get; }

   public T Value { get; }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню