2012-12-04 13 views
6

私は単純な検索テキストボックスを持っています。このテキストボックスはフィルターとして機能します。私は今5回目のコードをコピー/ペーストしていて、十分です。カスタムコントロールの時間。WPF - <T>をdependencyPropertyとして使用することができます

左右のブラケットはシンプルになります()

マイカスタムコントロールに置き換えられました。私の問題は、List(T)型のこのコントロールにdependencyPropertyを持たせたいということです。

私はそれを実証するためのテストプロジェクトを作成し、それが動作することを確認しました。それはうまくいく。リストを無視する。

以下はクラス全体です。問題は、私を保持しているのはList(Person)をList(T)に置き換えることだけです。何かリストのようなものです:Tはオブジェクトです

typeof(List(T)ここで:Tは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; 
    } 
} 

答えて

11

いいえ、それは可能ではありません。
代わりに、非汎用のtypeof(IList)を使用してください。

+0

これは私の問題を解決しますか?実際の不動産をどのように宣言しますか? Public IList <> FilterSourceを宣言することはできません。コンパイラエラー。 IListに含まれていないものを定義する必要がありますか? – tronious

+0

@ user1631520: 'IList 'です。 – SLaks

+0

コンパイラが「Generic type 'System.Collections.Generic.IListを使用すると」には1つの引数が必要ですpublic static readonly DependencyProperty SourceProperty = DependencyProperty.Register( "FilterSource"、typeof(IList <>)、typeof (SearchTextBox)、新しいUIPropertyMetadata(NULL)); 公共のIList FilterSource – tronious

関連する問題