
using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Navigation;

using Silverlight30.Model;

using System.Xml.Linq;

namespace Silverlight30.Control

{

public partial class AutoCompleteBox : Page

{

public AutoCompleteBox()

{

InitializeComponent();

this.Loaded += new RoutedEventHandler(AutoCompleteBox_Loaded);

}

void AutoCompleteBox_Loaded( object sender, RoutedEventArgs e)

{

Init();

Init2();

}

private void Init()

{

// IsDropDownOpen - 是否显示自定完成的下拉框

autoCompleteBox.GotFocus += delegate { autoCompleteBox.IsDropDownOpen = true; };

autoCompleteBox.Focus();

List< string> collection = new List< string>();

collection.Add( "aabb");

collection.Add( "aabc");

collection.Add( "abcc");

collection.Add( "abbc");

collection.Add( "aaab");

collection.Add( "bcca");

collection.Add( "bbac");

collection.Add( "cbaa");

collection.Add( "ccaa");

collection.Add( "cccb");

collection.Add( "cccc");

collection.Add( "cabc");

collection.Add( "cabb");

autoCompleteBox.ItemsSource = collection;

/*

* ItemFilter - 过滤下拉框内的对象

* TextFilter - 过滤下拉框内的字符串

* SearchText - 以此值为参数,过滤下拉框中的数据

* SelectedItem - 下拉框当前所选中的对象

*/

// 自定义 FilterMode

// 第一个参数:用户输入的值;第二个参数:下拉框中的对象

autoCompleteBox.ItemFilter += (search, value) =>

{

if (value.ToString().ToLower().StartsWith(search.ToLower()) || value.ToString().ToLower().EndsWith(search.ToLower()))

return true;

return false;

};

}

private void Init2()

{

List<EmployeeModel> employees = new List<EmployeeModel>();

employees.Add( new EmployeeModel { Name = "aabb", DateOfBirty = DateTime.Now, Salary = 111 });

employees.Add( new EmployeeModel { Name = "aabc", DateOfBirty = DateTime.Now, Salary = 112 });

employees.Add( new EmployeeModel { Name = "abcc", DateOfBirty = DateTime.Now, Salary = 113 });

employees.Add( new EmployeeModel { Name = "abbc", DateOfBirty = DateTime.Now, Salary = 114 });

employees.Add( new EmployeeModel { Name = "aaab", DateOfBirty = DateTime.Now, Salary = 115 });

employees.Add( new EmployeeModel { Name = "bcca", DateOfBirty = DateTime.Now, Salary = 116 });

employees.Add( new EmployeeModel { Name = "bbac", DateOfBirty = DateTime.Now, Salary = 117 });

employees.Add( new EmployeeModel { Name = "cbaa", DateOfBirty = DateTime.Now, Salary = 118 });

employees.Add( new EmployeeModel { Name = "ccaa", DateOfBirty = DateTime.Now, Salary = 119 });

employees.Add( new EmployeeModel { Name = "cccb", DateOfBirty = DateTime.Now, Salary = 1111 });

employees.Add( new EmployeeModel { Name = "cccc", DateOfBirty = DateTime.Now, Salary = 1112 });

employees.Add( new EmployeeModel { Name = "cabc", DateOfBirty = DateTime.Now, Salary = 1113 });

employees.Add( new EmployeeModel { Name = "cabb", DateOfBirty = DateTime.Now, Salary = 1114 });

autoCompleteBoxTemplate.ItemsSource = employees;

}

/// <summary>

/// 演示如何实现按需加载下拉框的数据

/// </summary>

private void autoCompleteBoxPopulate_Populating( object sender, PopulatingEventArgs e)

{

// Populate 是异步的,调用服务也是异步的

// 所以要先在 Populating 中 Cancel 掉 Populate,以便异步调用服务

// 服务返回结果后再调用 PopulateComplete() 方法,以便触发 Populated 事件

e.Cancel = true;

List< string> names = new List< string>();

Uri uri = new Uri( "http://localhost:8616/Employee.svc/names/" + e.Parameter, UriKind.Absolute);

WebClient client = new WebClient();

client.DownloadStringCompleted += (s, args) =>

{

if (args.Error != null)

{

MessageBox.Show("调用服务出错" + args.Error.ToString());

return;

}

XDocument xml = XDocument.Parse(args.Result);

XNamespace ns = "http://schemas.microsoft.com/2003/10/Serialization/Arrays";

autoCompleteBoxPopulate.ItemsSource = xml.Root.Elements(ns + "string").Select(p => p.Value).ToList();

autoCompleteBoxPopulate.PopulateComplete();

};

client.DownloadStringAsync(uri);

}

}

}