7

我有一个简单的搜索文本框。此文本框充当过滤器。我现在已经第五次复制/粘贴代码了,足够了。是时候自定义控件了。

左右括号已替换为 ()

我的自定义控件将很简单。我的问题是我想在这个控件上拥有一个 List(T) 类型的 dependencyProperty。

我创建了一个测试项目来证明它并确保它有效。它运作良好。忽略列表。

下面是全班。问题是唯一让我受不了的就是用 List(T) 替换 List (Person)。类似于 List 的东西,其中:T 是对象

typeof(List(T) where: T is Object) <= 显然我不能这样做,但可以说明我要完成的工作。

public class SearchTextBox : TextBox
{
    public static readonly DependencyProperty SourceProperty =
        DependencyProperty.Register("FilterSource", typeof(List<Person>), typeof(SearchTextBox), new UIPropertyMetadata(null)); //I WANT THIS TO BE LIST<T>

    public List<Person> FilterSource
    {
        get
        {
            return (List<Person>)GetValue(SourceProperty);
        }
        set
        {
            SetValue(SourceProperty, value);
        }
    }

    public static readonly DependencyProperty FilterPropertyNameProperty =
        DependencyProperty.Register("FilterPropertyName", typeof(String), typeof(SearchTextBox), new UIPropertyMetadata());

    public String FilterPropertyName
    {
        get
        {
            return (String)GetValue(FilterPropertyNameProperty);
        }
        set
        {
            SetValue(FilterPropertyNameProperty, value);
        }
    }

    public SearchTextBox()
    {
        this.KeyUp += new System.Windows.Input.KeyEventHandler(SearchBox_KeyUp);
    }

    void SearchBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(FilterSource);

        view.Filter = null;
        view.Filter = new Predicate<object>(FilterTheSource);
    }

    bool FilterTheSource(object obj)
    {
        if (obj == null) return false;

        Type t = obj.GetType();

        PropertyInfo pi = t.GetProperty(FilterPropertyName);

        //object o = obj.GetType().GetProperty(FilterPropertyName);

        String propertyValue = obj.GetType().GetProperty(FilterPropertyName).GetValue(obj, null).ToString().ToLower();

        if (propertyValue.Contains(this.Text.ToLower()))
        {
            return true;
        }

        return false;
    }
}
4

1 回答 1

12

不; 那是不可能的。
相反,只需使用非通用typeof(IList).

于 2012-12-04T18:35:03.650 回答