彩票走势图

让Silverlight AutoCompleteBox控件支持多属性筛选

转帖|其它|编辑:郝浩|2011-06-30 14:10:25.000|阅读 604 次

概述:本文主要介绍如何让Silverlight AutoCompleteBox控件支持多属性筛选,希望对大家有帮助。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  首先我们先建立一个实体类并创建它的集合用于绑定控件的ItemSource属性,这个实体类有两个属性,如下:

1:      public class AUser   
2:      {   
3:          public string Name { set; get; }   
4:          public string Age { set; get; }   
5:      }

编写XAML如下:

<sdk:AutoCompleteBox Height="28" Name="autoCompleteBox1" ValueMemberPath="Age">
<sdk:AutoCompleteBox.ItemTemplate>                
<DataTemplate>                    
<StackPanel>                       
<TextBlock  Text="{Binding Name}"/>                        
<TextBlock Text="{Binding Age}"/>                    
</StackPanel>                
</DataTemplate>    
</sdk:AutoCompleteBox.ItemTemplate>
</sdk:AutoCompleteBox>

  大家都知道, 一般情况下AutoCompleteBox控件只能筛选绑定项中的一个属性,(及ValueMemberPath在本例中只能设置为Name或Age),并且ValueMemberPath属性中的路径既是筛选属性路径又是选定项的结果属性路径。

  接下来我们扩展它,使它能支持多属性路径,并能指定输出结果属性路径。我的解决思路是利用附加属性的力量达到目标,代码如下:

1:   public static class AutoCompleteBoxHelper
2:      {
3:          private static void OnIsOtherPathChanged(DependencyObject obj,   DependencyPropertyChangedEventArgs e)
4:          {
5:              var acb = obj as AutoCompleteBox;
6:              if (!string.IsNullOrEmpty(e.NewValue.ToString()))
7:              {
8:                  acb.ItemFilter = (s,item)=>{
9:                      var objType = item.GetType();
10:                      string path = GetOtherPaths(acb);
11:                      var pathes = path.Split(',');
12:                      bool result = false;         
13:                      foreach (string p in pathes)
14:                      {
15:                          var propertyInfo = objType.GetProperty(p);
16:                          string value = propertyInfo.GetValue(item, null).ToString();
17:                          result |= value.Contains(s);
18:                      }
19:                      return result;
20:                  };
21:              }
22:              else
23:                 acb.ItemFilter = null;
24:          }
25:   
26:          public static string GetOtherPaths(DependencyObject obj)
27:          {
28:              return (string)obj.GetValue(OtherPathsProperty);
29:          }
30:   
31:          public static void SetOtherPaths(DependencyObject obj, string value)
32:          {
33:              obj.SetValue(OtherPathsProperty, value);
34:          }
35:   
36:          public static readonly DependencyProperty OtherPathsProperty =
37:             DependencyProperty.RegisterAttached("OtherPaths", typeof(string),
38:             typeof(AutoCompleteBoxHelper),
39:             new PropertyMetadata("", OnIsOtherPathChanged));
40:      }

  OtherPaths属性就是一个支持多属性路径的属性(如”Name,Age”),并且指定了OtherPaths后ValueMemeberPath的筛选作用就不再工作了,而只保留了选定结果项属性路径的功能。

  最后要叫它工作:

<sdk:AutoCompleteBox  Height="28" Name="autoCompleteBox1" ValueMemberPath="Age" 
loc:AutoCompleteBoxHelper.OtherPaths="Age,Name"&gt;

  运行结果:

a1a2

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP