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 国际」知识共享许可协议进行许可。

    欢迎大家关注微信号。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码) 微信公众平台
  • 相关阅读:
    idea工具如何在修改jsp后不用一直重启idea
    解决端口被占用问题
    tomcat端口强制关闭
    tomcat部署方式之三(war包,也是最重要的)
    tomcat部署方式之二
    tomcat的配置方式一
    在启动tomcat时出现java_home未配置的问题(闪退)
    mysql出现“mysql不是内部或外部命令也不是可运行”
    staruml下载
    用java语言实现一个观察者模式
  • 原文地址:https://www.cnblogs.com/maxzhang1985/p/2093124.html
Copyright © 2011-2022 走看看