2015-05-30 3 views
0

У меня есть это «прикрепленное свойство» и оно должно быть общим. В этом примере, чтобы нормально работать, мне нужно ввести переменную типа «Сотрудник». можно создать что-то более общее, всегда от «вложенного свойства» что-то более общего, а не литье «Сотрудника», преобразованным в строку и использовать его для любого ListViewФильтр Listview WPF

public static readonly DependencyProperty FilterSourceProperty = 
     DependencyProperty.RegisterAttached("FilterSource", typeof (TextBox), typeof (ListViewExtension), 
      new FrameworkPropertyMetadata(null, OnTextBoxSet)); 

public static TextBox GetFilterSource(DependencyObject dObj) 
{ 
    return (TextBox)dObj.GetValue(FilterSourceProperty); 
} 

public static void SetFilterSource(DependencyObject dObj, TextBox value) 
{ 
    dObj.SetValue(FilterSourceProperty, value); 
} 

private static void OnTextBoxSet(DependencyObject dObj, DependencyPropertyChangedEventArgs e) 
{ 
    var listView = dObj as ListView; 
    var textBox = e.NewValue as TextBox; 

    if ((listView != null) && (textBox != null)) 
    { 
     textBox.TextChanged += delegate(object sender, TextChangedEventArgs tcea) 
     { 
      var view = CollectionViewSource.GetDefaultView(listView.ItemsSource); 
      if (view == null) return; 
      view.Filter += item => 
      { 
       var textFilter = ((TextBox)sender).Text; 
       var itemPl = (Employee)item; 
       return itemPl.UserName.Contains(textFilter); 
      }; 
     }; 
    } 
} 

В .xaml

<ListView ...> 
... 
... 
tools:ListViewExtension.FilterSource="{Binding ElementName=txtFilter}" 
... 
... 
</ListView 

>

+0

использовать MVVM и фильтр в вашей ViewModel – blindmeis

ответ

0

не требует использования TextBox в OnTextBoxSet.

Попробуйте:

public static readonly DependencyProperty FilterSourceProperty = 
    DependencyProperty.RegisterAttached("FilterSource", typeof(string), typeof(Extentions), 
     new FrameworkPropertyMetadata(null, OnTextBoxSet)); 

    public static string GetFilterSource(DependencyObject dObj) 
    { 
     return (string)dObj.GetValue(FilterSourceProperty); 
    } 

    public static void SetFilterSource(DependencyObject dObj, string value) 
    { 
     dObj.SetValue(FilterSourceProperty, value); 
    } 

    private static void OnTextBoxSet(DependencyObject dObj, DependencyPropertyChangedEventArgs e) 
    { 
     var listView = dObj as ListView; 
     var text = e.NewValue as string; 

     if ((listView == null) || (text == null)) return; 

     var view = CollectionViewSource.GetDefaultView(listView.ItemsSource); 
     if (view == null) return; 
     view.Filter += item => 
     { 
      var itemPl = (Employee) item; 
      return itemPl.UserName.Contains(text); 
     }; 
    } 

В XAML: (набор Путь Element)

<ListView tools:ListViewExtension.FilterSource="{Binding ElementName=txtFilter,Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 

Редакцией:

private static void OnTextBoxSet(DependencyObject dObj, DependencyPropertyChangedEventArgs e) 
    { 
     var listView = dObj as ListView; 
     var text = e.NewValue as string; 

     if ((listView == null) || (text == null)) return; 

     var view = CollectionViewSource.GetDefaultView(listView.ItemsSource); 
     if (view == null) return; 
     view.Filter += item => 
     { 
      var type = item.GetType(); 
      if (type == typeof(Employee)) 
      { 
       var itemPl = (Employee)item; 
       return itemPl.UserName.Contains(text); 
      } 
      if (type == typeof(Person)) 
      { 
       var itemPl = (Person)item; 
       return itemPl.Name.Contains(text); 
      } 
      //and more types .............. 
      return false; 
     }; 
    } 
+0

Спасибо за помощь, но 2 проблемы: 1) Код не делает t, не фильтрует результаты при вводе в текстовое поле, где-то должно быть событие ** «textBox.TextChanged» ** 2) Это не то, что я спросил. Мне нужно избегать этого ** «элемент var itemPl = (Employee);» ** Я не хочу явно указывать «Сотрудник». Я хочу быть общим и использовать его с любым классом. – avechuche

+0

@ avechuche, теперь underestand ваша проблема, пожалуйста, подождите, разрешите это. – Mohsen

+0

@ avechuche, пожалуйста, проверьте EDITED код, – Mohsen

Смежные вопросы