我使用ComboBox
作为MultiBinding
(例如“644 Pizza Place”)获得了很多“客户”的Text
,这从头开始(CustomerNumber)进行了很好的搜索。但是如何选择匹配并选择只需输入“Pizza Place”?
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="CustomerNumber" />
<Binding Path="CustomerName" />
</MultiBinding>
答案 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文件中更改;语法。