我得到了包含名称的组合框。我的目标是使用文本框搜索字符串,然后以该字符串开头的名称将显示在组合框中。
例如:
我的组合框包含下一项:
“马克”、“阿里克”、“迈克尔”
当用户Mi
在文本框中写“”时,组合框将只显示“ Michael
”。
PS没有按钮。只有文本框和组合框。
我得到了包含名称的组合框。我的目标是使用文本框搜索字符串,然后以该字符串开头的名称将显示在组合框中。
例如:
我的组合框包含下一项:
“马克”、“阿里克”、“迈克尔”
当用户Mi
在文本框中写“”时,组合框将只显示“ Michael
”。
PS没有按钮。只有文本框和组合框。
好吧,如果您使用绑定来填充组合框,您应该只创建文本属性并将其绑定到文本框(双向模式绑定)。
在此属性的设置器中,您只需更改早期设置过滤视图的过滤条件。
http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.getdefaultview.aspx
在某些情况下,您可能希望过滤集合而不是其视图。但决定权的是你。
我准备了你的例子。
在我的示例中,我使用了两个附加程序集:
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>
视图模型类:
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();
}
这是带有附加程序集的所有解决方案(ComboBoxFilter.zip)。