У меня есть поле со списком, с которым я добавляю в начале <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)
, для свойства не устанавливается нулевое значение. Есть ли способ, которым я могу это сделать?
Замените <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>
Я недавно столкнулся с этим... Один из способов подойти к этому - иметь модель представления, которая может предоставлять свойство нулевого значения:
public class ListItemValue<T>
{
public ListItemValue(string name, T value)
{
Name = name;
Value = value;
}
public string Name { get; }
public T Value { get; }
}
PropertyName
имеет значениеnull
, то в выпадающем списке выбрано значение(None)
. У меня есть(None)
запись в выпадающем списке, но она не выбрана.