簡體   English   中英

WPF ComboBox - 不區分大小寫的數據綁定

[英]WPF ComboBox - case insensitive data-binding

如果我正在對WPF組合框進行數據綁定,是否有辦法使綁定不區分大小寫?

例如,如果組合框綁定到值為HELLO的屬性,那么讓它選擇值為Hello的組合框項?

我通過實現IMultiValueConverter來實現這一點。

轉換器應用於ComboBox上的ItemsSource綁定並設置兩個綁定。 第一個用於要選擇的值。 第二個綁定到ComboBox的ItemsSource屬性,它是可能值的列表。

<ComboBox ItemsSource="{Binding Path=DataContext.EntityTypeOptions, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
    <ComboBox.SelectedValue>
        <MultiBinding Converter="{StaticResource SelectedValueIgnoreCaseConverter}">
            <Binding Path="UpdatedValue" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged" />
            <Binding Path="ItemsSource" Mode="OneWay" RelativeSource="{RelativeSource Mode=Self}" />
        </MultiBinding>
    </ComboBox.SelectedValue>
</ComboBox>

對於轉換器,Convert()方法在ItemsSource忽略大小寫中找到選定的值,然后從ItemsSource返回匹配的值。

ConvertBack()方法只是將選定的值放回到對象數組的第一個元素中。

Imports System.Globalization
Imports System.Windows.Data
Imports System.Collections.ObjectModel

Public Class SelectedValueIgnoreCaseConverter
    Implements IMultiValueConverter

    Public Function Convert(values() As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IMultiValueConverter.Convert
        Dim selectedValue As String = TryCast(values(0), String)
        Dim options As ObservableCollection(Of String) = TryCast(values(1), ObservableCollection(Of String))

        If selectedValue Is Nothing Or options Is Nothing Then
            Return Nothing
        End If

        options.Contains(selectedValue, StringComparer.OrdinalIgnoreCase)
        Dim returnValue As String = Utilities.Conversions.ParseNullToString((From o In options Where String.Equals(selectedValue, o, StringComparison.OrdinalIgnoreCase)).FirstOrDefault)

        Return returnValue
    End Function

    Public Function ConvertBack(value As Object, targetTypes() As Type, parameter As Object, culture As CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack
        Dim result(2) As Object
        result(0) = value
        Return result
    End Function
End Class

在視圖模型上創建一個新屬性,該屬性提供以所需格式轉換為字符串的屬性值。 將您的ComboBox(或其他WPF小部件)綁定到該屬性。

例如:

public string NameOfValue
{
    get
    {
        return this.OtherProperty.ToCapitalizedString();
    }
}

通過這種方式,您可以精確控制屬性值的格式化以顯示它。 但是,現在您必須向其他屬性添加更改通知,以便在更改OtherProperty的值時,數據綁定知道更新新屬性的顯示。

public string OtherProperty
{
    get { .. }
    set
    {
        Notify();
        Notify("NameOfValue");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM