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"/>
Другие вопросы по тегам