WPF Combobox, когда SelectedValue равен 0, тогда Combobox не должен выбирать
У меня есть выпадающий список в приложении WPF с MVVM. Это выглядит как, -
<ComboBox x:Name="cboParent"
SelectedValuePath="FileId"
DisplayMemberPath="FileName"
IsEditable="True"
ItemsSource="{Binding Files}"
MaxDropDownHeight="125"
SelectedValue="{Binding Path=SelectedFile.ParentFileId}"
SelectedItem="{Binding Path=SelectedParentFile, Mode=TwoWay}" Height="26"/>
Коллекция Files имеет собственный ссылочный ключ ParentFileId. Теперь когда-нибудь этот ParentFileId будет нулевым; это означает, что нет родительского файла. В этом случае я ожидаю, что хотя в раскрывающемся списке будут все файлы, но не будет никакого SelectedItem.
Но на самом деле я получаю SelectedFile как SelectedItem в ComboBox.
Могу ли я получить ComboBox без выбора, когда ParentFileId равен нулю?
(Я не хочу добавлять файл-заполнитель в коллекцию файлов с FileId, равным нулю.)
1 ответ
Во-первых, объяснение, почему это не работает из коробки:
SelectedValue
возвращает null
значение, когда SelectedItem
это также null
, Ваш ParentFileId
свойство - это целое число (я думаю), которое не поддерживает null
значения, и он не может знать, как вы хотите конвертировать из null
к целочисленному значению. Таким образом, Привязка выдает ошибку, и значение остается неизменным в ваших данных.
Вам нужно указать, как вы хотите конвертировать эти нулевые значения с помощью простого конвертера, например:
public class NullToZeroConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value.Equals(0))
return null;
else
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return 0;
else
return value;
}
}
Добавьте его в качестве ресурса для просмотра:
<Grid ...>
<Grid.Resources>
<local:NullToZeroConverter x:Key="nullToZeroConverter" />
...
</Grid.Resources>
...
</Grid>
А затем использовать его в своем SelectedValue
Переплет:
<ComboBox x:Name="cboParent"
SelectedValuePath="FileID"
DisplayMemberPath="FileName"
IsEditable="True"
ItemsSource="{Binding Files}"
MaxDropDownHeight="125"
Validation.Error="cboParent_Error"
SelectedValue="{Binding Path=SelectedFile.ParentFileID,
Converter={StaticResource nullToZeroConverter}}"
SelectedItem="{Binding Path=SelectedParentFile, Mode=TwoWay}"
Height="26"/>