2016-07-08 1 views
0

問題の短い背景: 私はWPFアプリケーションのUI部分で作業しています。しかし、私はかなり早く自分の部分を終えたので、ListBoxフィルタリング機能を実装しようと決めました。私はこの時点で持っている何ListBoxのリアルタイムフィルタリング

<TextBox Style="{StaticResource WaterMarkMessageTextBoxStyle}" 
      x:Name="usuariosDisponiblesSearch" 
      Grid.Column="1" Grid.Row="1"/> 
    <ListBox Style="{StaticResource ListBoxTable}" 
      ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}"     
      AlternationCount="2" 
      Grid.Column="1" Grid.Row="2" 
      x:Name="lbPossibleContracts" 
      SelectionChanged="lbPossibleContracts_SelectionChanged" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Path=Nombre}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

のTextBoxは、検索文字列が含まれています。 ListBox - フィールドNombreによってDBから選択されたデータを反映します。

エンドポイントで - ListBoxにテキストボックス内の文字列と一致する項目のみを表示する作業フィルタが必要です。リアルタイム。

もちろん、バックコードを変更せずに行うことは不可能であると私は理解しています。

これまでのところ、フィルタ機能を実装するための私のアプローチは失敗しました。なぜなら、主に私がバックコードにどのような実装をしているのかが分からなかったからです。

これについての助けに感謝します。どんな方向でも動作します - コード全体(:)を生成したい場合 - 平等で解決された問題への良い、分かりやすい参照があれば歓迎されます。

UPDATE

[OK]を、私は主題でかなり大きな進歩を遂げています。コードはここhttp://www.wpf-tutorial.com/listview-control/listview-filtering/

をされています:

私はこの例を以下ました

public partial class ProjectAssignUsuariosView : UserControl 
{ 
    private ProjectAssignUsuariosViewModel _viewModel; 



    public ProjectAssignUsuariosView(Proyecto proyecto) 
    { 
     InitializeComponent(); 

     _viewModel = new ProjectAssignUsuariosViewModel(proyecto); 

     //TempFilterPart 
     lbPossibleContractsFilter.ItemsSource = _viewModel.UsuariosLibres; 
     List<Usuario> items = new List<Usuario>(); 
     filteredUsers.ItemsSource = items; 
     CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lbPossibleContractsFilter.ItemsSource); 
     view.Filter = UserFilter; 
     //Filtering part ends 
    } 

    //Filtering 
    private bool UserFilter(object item) 
    { 
     if (String.IsNullOrEmpty(usuariosDisponiblesSearch.Text)) 
      return true; 
     else 
      return ((item as Usuario).Nombre.IndexOf(usuariosDisponiblesSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0); 
    } 


    private void usuariosDisponiblesSearch_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     CollectionViewSource.GetDefaultView(lbPossibleContractsFilter.ItemsSource).Refresh(); 
    } 
    //Filtering ends 

エラーなしコンパイル中:ここ

 <TextBox Style="{StaticResource WaterMarkMessageTextBoxStyle}" 
      x:Name="usuariosDisponiblesSearch" 
      Grid.Column="1" Grid.Row="1" 
      TextChanged="usuariosDisponiblesSearch_TextChanged" /> 
     <ListBox Style="{StaticResource ListBoxTable}" 
       ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}" 
       AlternationCount="2" 
       Margin="0,20,0,0" 
       x:Name="lbPossibleContractsFilter" 
       SelectionChanged="lbPossibleContracts_SelectionChanged" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Nombre}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

をして、backcodeです。しかし、実行中にTextBoxを変更すると、予期しないアプリケーションエラーがスローされます。そして、デバッガは、 "NullReferenceExceptionはユーザコードによって処理されませんでした。追加情報:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

+3

CollectionViewSourceを使用してフィルタリングするためにSOを検索してみてください –

+0

素晴らしいスタートアップのようなサウンドです!簡単な質問 - 後ろに何があるの?前もって感謝します! –

+1

このサイト、stackoverflow –

答えて

0

わかりました。私は、この目的のために安定した作業プロトタイプを作っています。 私はこの例に従っていました:http://www.wpf-tutorial.com/listview-control/listview-filtering/ 唯一の違いは、ItemsSourceが外に置かれたことです。

ここに作業コード(簡体字)があります。

XAML:Nameプロパティ、のItemsSourceにアクセスすることができます:ここ

<ListBox Style="{StaticResource ListBoxTable}" 
      ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}"     
      AlternationCount="2" 
      Grid.Column="1" Grid.Row="2" 
      x:Name="lbPossibleContracts" 
      SelectionChanged="lbPossibleContracts_SelectionChanged" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Path=Nombre}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

重要な部分は、リストボックスのxです。 ListBox SelectionChanged Propertiesは、結果の更新を呼び出します。

XAML.CS:

  1. lbPossibleContracts:

    namespace Todiste.Views.Proyectos 
    { 
    public partial class ProjectAssignUsuariosView : UserControl 
    { 
        private ProjectAssignUsuariosViewModel _viewModel; 
        public ProjectAssignUsuariosView(Proyecto proyecto) 
        { 
         InitializeComponent(); 
    
         _viewModel = new ProjectAssignUsuariosViewModel(proyecto); 
    
         lbCurrentContracts.ItemsSource = _viewModel.UsuariosProyecto; 
         lbPossibleContracts.ItemsSource = _viewModel.UsuariosLibres; 
         //Filter Starts    
         CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lbPossibleContracts.ItemsSource); 
         view.Filter = UserFilter; 
         //Filter Ends 
        } 
    
        //Filter Starts 
        private bool UserFilter(object item) 
        { 
         if (string.IsNullOrEmpty(filter.Text)) 
          return true; 
         else 
          return ((item as Usuario).Nombre.IndexOf(filter.Text, StringComparison.OrdinalIgnoreCase) >= 0); 
        } 
    
        private void filter_TextChanged(object sender, TextChangedEventArgs e) 
        { 
         CollectionViewSource.GetDefaultView(lbPossibleContracts.ItemsSource).Refresh(); 
        } 
        // Filter Ends 
    

    ここでは、3つの主要なポイント、価値が注目されています。ItemsSource = _viewModel.UsuariosLibres; - リストに

  2. Collectionビュー=外のデータソースを割り当てる - 定義を、ビュー
  3. UserFilterとfilter_TextChangedは - 実際にフィルタリングして、リスト爽快アクション

ない最高のスタイルを実行する機能、ですが、働くもの