7

単純な検索テキスト ボックスがあります。このテキスト ボックスはフィルターとして機能します。コードをコピーして貼り付けたのは 5 回目ですが、これで十分です。カスタム コントロールの時間です。

左右の括弧は () に置き換えられました

私のカスタム コントロールはシンプルです。私の問題は、このコントロールに List(T) 型の dependencyProperty を持たせたいということです。

テストプロジェクトを作成して、それを証明し、機能することを確認しました。それはうまくいきます。リストを無視する。

以下はクラス全体です。問題は、List (Person) を List(T) に置き換えることだけが私を悩ませていることです。List のようなもの: T は Object

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 に答える