zoukankan      html  css  js  c++  java
  • 让Silverlight AutoCompleteBox控件支持多属性筛选

    首先我们先建立一个实体类并创建它的集合用于绑定控件的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">

    运行结果:

    a1a2

    作者: YOYOFx

    出处:https://www.cnblogs.com/maxzhang1985/p/12673160.html

    版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

    欢迎大家关注微信号。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码) 微信公众平台
  • 相关阅读:
    今天博客开通第一天,以此纪念!
    基于opencv的车牌识别系统
    【C和指针】笔记1
    【局域网聊天客户端篇】基于socket与Qt
    对Qt下对话服务器客户端的总结(MyTcpServer与MyTcpClient)
    linux 线程编程详解
    【linux】安装samba服务
    linux(ubuntu)获取命令源码方式
    win7下用SSH连接linux虚拟机
    Linux下deb包安装工具(附带安装搜狗输入法)
  • 原文地址:https://www.cnblogs.com/maxzhang1985/p/2093124.html
Copyright © 2011-2022 走看看