当 SelectedValue 为 0 时,WPF 组合框不应选择

本文关键字:组合 选择 WPF SelectedValue | 更新日期: 2023-09-27 17:56:22

我在实现了MVVM的WPF应用程序中有一个组合框。它看起来像——

<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 集合具有作为父文件标识的自引用键。现在有时这个父文件ID将为零;这意味着没有父文件。在这种情况下,我希望虽然下拉列表将包含所有文件,但不会有任何 SelectedItem。

但实际上,我将选定文件作为组合框中的选定项。

当父文件ID为零时,我可以在没有选择任何内容的情况下获取组合框吗?

(我不想在 FileId 为零的文件集合中添加任何占位符文件。

当 SelectedValue 为 0 时,WPF 组合框不应选择

首先,解释为什么这不能开箱即用:

SelectedItemnull时,SelectedValue返回一个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"/>