Как получить Combobox для установки значения NULL при привязке к «SelectedItem»? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть поле со списком, с которым я добавляю <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), для свойства не устанавливается значение null.Есть ли способ, которым я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Замените <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 голосов
/ 23 октября 2018

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

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

   public string Name { get; }

   public T Value { get; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...