我得到了包含名字的组合框。我的目标是使用文本框搜索字符串,而不是以该字符串开头的名称将显示在组合框中。
例如:
我的组合框包含下一项:
“马克”,“阿里克”,“迈克尔”
当用户在文本框中编写“Mi
”时,组合框将仅显示“Michael
”。
P.S没有按钮。只有文本框和组合框。
答案 0 :(得分:0)
好吧,如果你使用绑定来填充组合框,你应该只创建文本属性并将其绑定到文本框(双向模式绑定)。
在此属性的setter中,您只需更改视图的早期设置过滤的过滤条件。
http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.getdefaultview.aspx
在某些情况下,您可能希望过滤集合而不是其视图。 但是由你来决定。
答案 1 :(得分:0)
我为你准备了榜样。
在我的示例中,我使用了两个额外的程序集:
XAML文件:
<Window x:Class="ComboBoxFilter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
>
<Grid>
<StackPanel>
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<i:InvokeCommandAction Command="{Binding SearchItems}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<ComboBox ItemsSource="{Binding MySourceData}" />
</StackPanel>
</Grid>
</Window>
ViewModel类:
class MainViewModel : NotificationObject
{
public MainViewModel()
{
_myItems.Add("aaa");
_myItems.Add("abb");
_myItems.Add("aab");
_myItems.Add("bbb");
_myItems.Add("bcc");
_myItems.Add("bbc");
SearchItems = new DelegateCommand(this.OnSearchItems);
}
private string _searchText;
public string SearchText
{
get { return _searchText; }
set { _searchText = value; RaisePropertyChanged(() => SearchText); }
}
private ICollectionView _mySourceData;
public ICollectionView MySourceData
{
get { return CollectionViewSource.GetDefaultView(_myItems); }
}
private List<string> _myItems = new List<string>();
public ICommand SearchItems { get; private set; }
private void OnSearchItems()
{
MySourceData.Filter = (o) => { return string.IsNullOrEmpty(SearchText) ? true : (o as string).StartsWith(SearchText); };
}
}
不要忘记在ctor中设置窗口DataContext:
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
Here是附加程序集的所有解决方案(ComboBoxFilter.zip)。