由于大小写不同,WPF Combobox 在 ItemSource 中找不到 SelectedValue

WPF Combobox can't find SelectedValue in ItemSource because of different case

我有一个组合框,用于显示已安装打印机的列表。我的视图模型的 Printer 属性 是使用特定打印机路径字符串预定义的,如下所述。但是,ComboBox 最初并未设置为预定义值。这似乎是由于预定义值的大小写与已安装打印机列表中的值不同所致。

我创建了一个 PrinterViewModel class 看起来像:

public class PrinterViewModel
{
    public string Name { get; set; } // Name of the printer (e.g. 'My Printer on PrinterServer')
    public string Id { get; set; } // Path of the printer (e.g. '\PrinterServer\My Printer')
}

组合框看起来像:

<ComboBox
    ItemsSource="{Binding Printers}"
    SelectedValue="{Binding Printer, Mode=TwoWay}"
    SelectedValuePath="Id"
    DisplayMemberPath="Name" />

其中 PrintersObservableCollection<PrinterViewModel> 属性,Printer 是字符串 属性,应由 Id 填充。

例如,如果我为 Printer 预定义的值为“\printerserver\My Printer”,但已安装打印机的列表包含“\PrinterServer\MyPrinter”,因为大小写不同,这些不匹配SelectedValue 未应用于我的 ComboBox。

有没有办法将提供的 SelectedValueItemSource 中的项目进行比较并忽略大小写?

您可以让 Printer 属性 始终保持小写字母 Id,然后在 SelectedValue 绑定中使用转换器:

// Don't forget to add support for INotifyPropertyChanged
private string printer;
public string Printer
{
    get { return printer; }
    set { printer = value == null ? null : value.ToLower(); }
}
<ComboBox ItemsSource="{Binding Printers}"
          SelectedValue="{Binding Printer, Mode=TwoWay, Converter={local:ToLowerConverter}}"
          SelectedValuePath="Id"
          DisplayMemberPath="Name" />