AutoCompleteTextBox: First Meet

AutoCompleteTextBox in DotNetProjects.Wpf.Toolkit

DotNetProjects.Wpf.Toolkit 套件提供了AutoCompleteTextBox,它是一個可以在 WPF 程式裡面使用的控制項。除了像TextBox一樣,提供使用者輸入文字外,在使用者輸入文字的同時,能根據使用者的輸入及時提供符合自訂條件的建議字串清單,加快使用者的輸入速度。

要使用AutoCompleteTextBox,使用者必須先提供候選的清單以及過濾的方法。

實作過程

  • 新開始名為TestAutoCompleteTextBox的WPF Application方案
  • 在TestAutoCompleteTextBox專案中用Nuget Manager 加入DotNetProjects.Wpf.Toolkit
  • 在TestAutoCompleteTextBox專案中加入類別檔案MainWindowViewModel.cs用來當作MainWindow.xaml的視模(ViewModel)
  • 在MainWindowViewModel類別實作
    • INotifyPropertyChanged介面
    • 可當作繫結來源屬性的Name,類型為string
    • 可當作繫結來源屬性的Names屬性,類型為List<string> ,用Names來當作候選清單
    • 可當作繫結來源的Filter屬性,Filter是個過濾器,利用使用者的輸入內容,從候選清單Names中挑出子清單供使用者挑選。
  • 在 MainWindow.xaml 中:
    • Window的屬性增加 xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=DotNetProjects.Input.Toolkit"
    • Window的Resources裡面增加資源<local:MainWindowViewModel x:Key="viewmodel" />
    • 設定Window裡的DataContex為資源裡的viewmodel
    • Window裡增加AutoCompleteTextBox的案例。將其屬性Text以雙向繫結的方式與視模端的來源屬性Name。將其屬性ItemFilter與視模端的來源屬性Filter繫結。將其屬性ItemSource與視模端的來源屬性Names繫結。將MinimumPrefixLength屬性設定為"1",代表使用者只要打1個字元,AutoCompleteTextBox就開始提供合格清單。

程式碼

MainWindowViewModel.cs

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Controls;
namespace TestAutoCompleteTextBox
{
    public class MainWindowViewModel:INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
            Names = new List<string>
            {
                "WPF","WCF","DotNet","Data Entity Framework"
            };
        }
        public List<string> Names { get; private set; }
        public event PropertyChangedEventHandler PropertyChanged;
        private string _Name;
        public string Name {
            get
            {
                return _Name;
            }
            set
            {
                if (value != _Name)
                {
                    _Name = value;
                    OnPropertyChanged("Name");
                }
            }
        }
        private void OnPropertyChanged(string PropertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        public AutoCompleteFilterPredicate<object> Filter
        {
            get
            {
                return (searchText, obj) => filter(searchText, obj);
            }
        }
        public bool filter(string editString, object obj)
        {
            string s = obj as string;
            return s.ToLower().Contains(editString.ToLower());
        }
    }
}

MainWindow.xaml

<Window x:Class="TestAutoCompleteTextBox.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:local="clr-namespace:TestAutoCompleteTextBox"
  xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=DotNetProjects.Input.Toolkit"  
  mc:Ignorable="d"
  Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <local:MainWindowViewModel x:Key="viewmodel" />
  </Window.Resources>
  <StackPanel DataContext="{StaticResource viewmodel}">
    <TextBlock Text="{Binding Name}" />
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="Input:" />
      <Controls:AutoCompleteBox Width="200"
        Text="{Binding Name, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
        ItemFilter="{Binding Filter}"
        ItemsSource="{Binding Names}"
        MinimumPrefixLength="1"   />
    </StackPanel>
  </StackPanel>
</Window>

註:假如細節的清單由物件所構成,則AutoCompleteTextBox可利用ItemTemplate屬性與ValueMemberPath屬性來完成任務。其中,ItemTemplate用來表現清單裡的物件,ValueMemberPath用來將所選物件之ValueMemberPath對應屬性值複製到AutoCompleteTextBox的Text屬性。

Share this

Previous
Next Post »

技術提供:Blogger.