1

コンボボックスに次のプロパティを設定しています-

    <ComboBox ItemsSource="{Binding AllLines, Mode=OneWay}" Grid.Column="1" SelectedItem="{Binding SelectedLine}" Margin="4"
              Visibility="{Binding ShowLines, Converter={StaticResource BoolToVisible}}" AlternationCount="2"
              IsTextSearchEnabled="True" IsEditable="True" TextSearch.TextPath="SearchText" IsTextSearchCaseSensitive="False"
              ItemContainerStyle="{StaticResource alternatingWithTriggers}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Margin="2,0,2,0" FontWeight="Bold" Text="{Binding Description}"
                               Visibility="{Binding Description, Converter={StaticResource NullVisibilityConverter}}"></TextBlock>
                    <TextBlock Margin="2,2,2,4" Text="{Binding Designator}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>                
    </ComboBox>

ここで概説した提案に従って、検索対象の 3 つのプロパティを含むカスタム検索プロパティを追加しました。 WPF: ComboBox の ItemTemplate を変更すると、入力時にリストを下にジャンプする機能が削除されます。これを修正する方法はありますか?

public string SearchText {get { return string.Format("{0} | {1} | {2}", Description, ID, Designator); }}

私の質問は、プロパティの連結に対してワイルドカード検索または部分文字列検索を実行できますか?

4

2 に答える 2

2

ここで私のソリューションをモデル化したアイデアを見つけました - http://jacobmsaylor.com/?p=17

KeyDown の代わりに KeyUp をリッスンし、フィルタで大文字と小文字を区別しないようにするなど、小さな変更を加えました。また、コンボ ボックスのテキスト (検索テキスト) が null または空でないことを確認するチェックを追加しました。

コードビハインドで-

public SelectRouteSegmentDialog()
{
    InitializeComponent();

    LineComboBox.Items.Filter += FilterPredicate;
}

private bool FilterPredicate(object obj)
{
    Line line = obj as Line;
    if (string.IsNullOrEmpty(LineComboBox.Text)) return true;

    if (line.SearchText != null)
    {
        if (line.SearchText.IndexOf(LineComboBox.Text, StringComparison.CurrentCultureIgnoreCase) >= 0)
        {
            return true;
        }
        return false;
    }
    else
    {
        //if the string is null, return false
        return false;
    }

}

private void combobox_KeyUp(object sender, KeyEventArgs e)
{
    if ((e.Key == Key.Enter) || (e.Key == Key.Tab) || (e.Key == Key.Return))
    {
        //Formatting options
        LineComboBox.Items.Filter = null;
    }
    else if ((e.Key == Key.Down) || (e.Key == Key.Up))
    {
        LineComboBox.IsDropDownOpen = true;
    }
    else
    {
        LineComboBox.IsDropDownOpen = true;
        LineComboBox.Items.Filter += this.FilterPredicate;
    }
}

そして、IsEditable=true、IsTextSearchEnabled=false、および TextSearch.TextPath を、選択したアイテムに表示したいパスと同じに設定した xaml (そうしないと、ToString だけが表示されました)。キーアップイベントも聞いてみました~

   <ComboBox ItemsSource="{Binding AllLines, Mode=OneWay}" Grid.Column="1" SelectedItem="{Binding SelectedLine}" Margin="4"
             Visibility="{Binding ShowLines, Converter={StaticResource BoolToVisible}}" AlternationCount="2"
              IsEditable="True" TextSearch.TextPath="SearchText" IsTextSearchEnabled="False"
              ItemContainerStyle="{StaticResource alternatingWithTriggers}" x:Name="LineComboBox" KeyUp="combobox_KeyUp">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Margin="2,0,2,0" FontWeight="Bold" Text="{Binding DisplayText}"
                               Visibility="{Binding Description, Converter={StaticResource NullVisibilityConverter}}"></TextBlock>
                    <TextBlock Margin="2,2,2,4" Text="{Binding Designator}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>                
    </ComboBox>
于 2013-11-07T19:30:36.297 に答える
1

私の質問は、プロパティの連結に対してワイルドカード検索または部分文字列検索を実行できますか?

組み込みのTextSearchメカニズムを使用しない; これはプレフィックス マッチのみです。テキストを直接指定するか、テキストを含むプロパティへのパスを指定することができますが (既に行ったように)、一致動作を変更することはできません。

必要な種類の動作を取得するには、独自のテキスト検索メカニズムを実装する必要があります。TextSearch実装のアイデアについては、ソース コードを調べてみてください。

于 2013-11-07T18:44:25.257 に答える