由于案例不同,WPF Combobox无法在ItemSource中找到SelectedValue

时间:2015-02-26 18:27:32

标签: c# wpf binding combobox

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

我创建了一个PrinterViewModel类,如下所示:

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看起来像:

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

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

例如,如果我Printer的预定义值是'\ printerserver \ My Printer',但已安装的打印机列表中包含'\ PrinterServer \ MyPrinter',则由于情况不同而导致这些不匹配,SelectedValue 1}}未在我的ComboBox中应用。

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

1 个答案:

答案 0 :(得分:1)

您可以让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" />