2

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

例如:

我的组合框包含下一项:

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

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

PS没有按钮。只有文本框和组合框。

4

2 回答 2

0

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

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

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

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

于 2012-11-03T17:52:17.233 回答
0

我准备了你的例子。

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

  1. Microsoft.Practices.Prism
  2. System.Windows.Interactivity

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)。

于 2012-11-03T18:23:20.263 回答