参考链接:
WPF-15:AutoCompleteBox的使用(实现下拉列表)
WPF: AutoCompleteBox, an autocomplete text box
如果出现未能加载程序集,可以参照这篇回答
准备:
WpfToolKit.dll,System.Windows.Controls.Input.Toolkit.dll
下载或通过nuget搜索安装,下载链接在第一个博客中
内容:
前端
通过wpftool框架实现自动补全信息或智能选择的功能
在前端添加
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
在窗口内实现AutoCompleteBox
<toolkit:AutoCompleteBox x:Name="searchTextBox" Grid.Row="1" ValueMemberPath="SerchString" Margin="10" FontSize="20" Height="50" IsTextCompletionEnabled="True" Foreground="Black">
<toolkit:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<TextBlock Margin="5,5" FontSize="26">
<Run Text="{Binding SerchString}" Foreground="Blue"/>
<Run Text="{Binding Name}" Foreground="Gray"/>
</TextBlock>
</DataTemplate>
</toolkit:AutoCompleteBox.ItemTemplate>
</toolkit:AutoCompleteBox>
后端
实现MVVM,实现INotPropertyChanged
接口,并创建事件将内容进行绑定,因为是实现代码,与第一个博客中内容基本一直,但是博客中本身的MessageBox
会引发进程错误,这一块并没有搞懂,因为不u影响功能的实现,所以将语句注释掉了
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.searchTextBox.Populating += new PopulatingEventHandler(AutoCompleteBox_Populating);
this.searchTextBox.SelectionChanged += new SelectionChangedEventHandler(SearchTextBox_selectionChanged);
}
void SearchTextBox_selectionChanged(object seder,SelectionChangedEventArgs e)
{
AutoCompleteModel model = this.searchTextBox.SelectedItem as AutoCompleteModel;
//if (model != null)
//{
// MessageBox.Show(model.Name);
//}
}
private void AutoCompleteBox_Populating(object sender,PopulatingEventArgs e)
{
e.Cancel = true;
List<AutoCompleteModel> data = new List<AutoCompleteModel>();
for(int i = 0; i < 10; i++)
{
AutoCompleteModel model = new AutoCompleteModel();
model.SerchString = "0"+ i.ToString();
model.Name = "测试" + i;
data.Add(model);
}
this.searchTextBox.ItemsSource = data;
this.searchTextBox.FilterMode = AutoCompleteFilterMode.Contains;
this.searchTextBox.PopulateComplete();
}
public class AutoCompleteModel : INotifyPropertyChanged
{
public void OnProperrtChanged(string proname)
{
if (this.PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(proname));
}
public event PropertyChangedEventHandler PropertyChanged;
private string searchString = string.Empty;
private string name = string.Empty;
public string SerchString
{
get { return searchString; }
set
{
searchString = value;
this.OnProperrtChanged("SearchString");
}
}
public string Name
{
get { return name; }
set
{
name = value;
this.OnProperrtChanged("Name");
}
}
}
}