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

左右括号已替换为 ()

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

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

下面是全类。问题在于,唯一阻止我的是用List(T)替换List(人)。类似于 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;
    }
}

最佳答案

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

关于WPF - 可以将 List<T> 用作依赖项属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13709562/

10-09 18:23
查看更多