我想在组合框中显示包含我搜索的文本的项目

时间:2012-11-03 17:42:22

标签: c# wpf data-binding combobox

我得到了包含名字的组合框。我的目标是使用文本框搜索字符串,而不是以该字符串开头的名称将显示在组合框中。

例如:

我的组合框包含下一项:

  

“马克”,“阿里克”,“迈克尔”

当用户在文本框中编写“Mi”时,组合框将仅显示“Michael”。

P.S没有按钮。只有文本框和组合框。

2 个答案:

答案 0 :(得分:0)

好吧,如果你使用绑定来填充组合框,你应该只创建文本属性并将其绑定到文本框(双向模式绑定)。

在此属性的setter中,您只需更改视图的早期设置过滤的过滤条件。

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.getdefaultview.aspx

在某些情况下,您可能希望过滤集合而不是其视图。 但是由你来决定。

答案 1 :(得分:0)

我为你准备了榜样。

在我的示例中,我使用了两个额外的程序集:

  1. Microsoft.Practices.Prism
  2. System.Windows.Interactivity
  3. 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)。