WPF ComboBox TextSearch使用Contains而不是StartsWith

时间:2013-03-07 15:36:10

标签: c# wpf combobox

我使用ComboBox作为MultiBinding(例如“644 Pizza Place”)获得了很多“客户”的Text,这从头开始(CustomerNumber)进行了很好的搜索。但是如何选择匹配并选择只需输入“Pizza Place”?

<MultiBinding StringFormat="{}{0} {1}">
    <Binding Path="CustomerNumber" />
    <Binding Path="CustomerName" />
</MultiBinding>

2 个答案:

答案 0 :(得分:4)

ComboBox使用TextSearch class进行项目查找。您可以在ComboBox上设置TextSearch.TextPath依赖项属性:

    <ComboBox Name="cbCustomers" TextSearch.TextPath="CustomerName">...</ComboBox>

这将允许您按CustomerName进行匹配,但您将通过CustomerNumber松散匹配。

查找没有太多细节,按以下方式完成: 键入时调用ComboBox.TextUpdated方法。此方法调用TextSearch.FindMatchingPrefix以查找匹配项。 TextSearch.FindMatchingPrefix是使用string.StartsWith(..)调用的方法。

无法替换string.StartsWith()调用或TextSearch.FindMatchingPrefix调用其他内容。因此,如果要将string.StartsWith()与自定义逻辑交换(如string.Contains),您似乎必须编写自定义ComboBox类

答案 1 :(得分:0)

这里我有MVVM框架的替代方案。

我的xaml文件:

<ComboBox Name="cmbContains" IsEditable="True" IsTextSearchEnabled="false" ItemsSource="{Binding pData}"  DisplayMemberPath="wTitle" Text="{Binding SearchText ,Mode=TwoWay}"  >
  <ComboBox.Triggers>
      <EventTrigger RoutedEvent="TextBoxBase.TextChanged">
          <BeginStoryboard>
              <Storyboard>
                  <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsDropDownOpen">
                      <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0"/>
                  </BooleanAnimationUsingKeyFrames>
              </Storyboard>
          </BeginStoryboard>
      </EventTrigger>
  </ComboBox.Triggers>
</ComboBox>

我的cs文件:

//ItemsSource - pData
//There is a string attribute - wTitle included in the fooClass (DisplayMemberPath)
private ObservableCollection<fooClass> __pData;
public ObservableCollection<fooClass> pData {
    get { return __pData; }
    set { Set(() => pData, ref __pData, value);
        RaisePropertyChanged("pData");
    }
}

private string _SearchText;
public string SearchText {
    get { return this._SearchText; }
    set {
        this._SearchText = value;
        RaisePropertyChanged("SearchText");

        //Update your ItemsSource here with Linq
        pData = new ObservableCollection<fooClass>{pData.ToList().Where(.....)};
    }
}

你可以看到可编辑的comboBox绑定到字符串(SearchText) 一旦有TextChanged事件,就会显示下拉列表,并且双向绑定会更新该值。 ItemsSource在进入集合{}时在cs文件中更改;语法。

A gist with the code above