2017-02-06 4 views
1

入力テキストに基づいてリストビューアイテムをフィルタリングしようとしていますが、選択が削除されているため、ブール値に基づいて表示を非表示に設定しようとしています)リストビューアイテムの可視性がブール値に基づく

私はこのコードを作成するために、一部の古い記事を使用し、それが動作していない理由を私は理解することはできません。正常に動作している

<ListView x:Name="osebe_listView" Margin="0,0,40,0" SelectionMode="Multiple" SelectionChanged="osebe_listView_SelectionChanged" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Hidden"> 

      <ListView.Resources> 

       <Style TargetType="{x:Type ListViewItem}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding visible}" Value="False"> 
          <Setter Property="Visibility" Value="Hidden"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
       <Style TargetType="{x:Type GridViewColumnHeader}"> 
        <Setter Property="Background" Value="#1AFFFFFF" /> 
        <Setter Property="BorderThickness" Value="0"/> 
       </Style> 
       <Style TargetType="{x:Type ColumnDefinition}"> 
        <Setter Property="Width" Value="10"/> 
       </Style> 

      </ListView.Resources> 

      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Naziv podjetja" DisplayMemberBinding="{Binding nazivPodjetja}"/> 
        <GridViewColumn Header="Ime" DisplayMemberBinding="{Binding ime}" Width="25"/> 
        <GridViewColumn Header="Priimek" DisplayMemberBinding="{Binding priimek}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
        <GridViewColumn Header="Naslov" DisplayMemberBinding="{Binding naslov}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
        <GridViewColumn Header="Pošta" DisplayMemberBinding="{Binding posta}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
        <GridViewColumn Header="Mobilna številka" DisplayMemberBinding="{Binding mobilnaSt}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
        <GridViewColumn Header="Stacionarna številka" DisplayMemberBinding="{Binding stacionarnaSt}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
        <GridViewColumn Header="E-naslov" DisplayMemberBinding="{Binding eMail}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
        <GridViewColumn Header="Skupina" DisplayMemberBinding="{Binding skupina}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

テキストフィルタ方式を():

private void isci_tb_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     try 
     { 
      if (isci_tb.Text == "search") return; 
      string s = isci_tb.Text; 
      if (isci_tb.Text == "") 
      { 
       foreach (Oseba o in seznamOseb) 
       { 
        //osebe_listView.Items.Add(o); 
        o.visible = true; 
       } 
      } 
      //else 
      //{ 
      // osebe_listView.Items.Clear(); 
       foreach (Oseba o in seznamOseb) 
       { 
        if(! (contejns(o.ime, s) || contejns(o.priimek, s) || contejns(o.mobilnaSt.ToString(), s) || contejns(o.posta, s) || contejns(o.nazivPodjetja, s) || contejns(o.stacionarnaSt.ToString(), s) || contejns(o.naslov, s) || contejns(o.eMail, s))) 
        { 
        o.visible = false; 
        } 
       } 
      //} 
     } 
     catch { } 
    } 

見つけましたcode here

私はデータバインディングを使用していません。私は何が欠けていますか?これは、動的にトリガーを取得するためにあなたのListViewItemスタイルでデータトリガのために必要とされる

public class Oseba : INotifyPropertyChanged 
{ 
    private bool _isVisible; 
    public bool visible 
    { 
     get { return _isVisible; } 
     set { _isVisible = value; NotifyPropertyChanged("visible"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

+0

OsebaクラスはINotifyPropertyChangedインターフェイスを実装していますか? – mm8

+0

彼は ''を使用しているリンクで、あなたのコードでそれを見つけることができません。 'o.visible'は何もしません。 –

+0

それはありません。どのように実装できますか?私はそのような設定のプロパティは、私はその投稿では、任意の追加のコードを見つけられなかったので十分だと思った – someone1

答えて

1

OsebaクラスがINotifyPropertyChangedインタフェースを実装し、visibleプロパティのセッターでPropertyChangedイベントを発生させていることを確認してください。

あなたはDataTriggerでカスタムスタイルにListViewItemContainerStyleプロパティをも設定する必要があります。

<ListView x:Name="osebe_listView" Margin="0,0,40,0" SelectionMode="Multiple" SelectionChanged="osebe_listView_SelectionChanged" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Hidden"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding visible}" Value="False"> 
        <Setter Property="Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.Resources> 
     <Style TargetType="{x:Type GridViewColumnHeader}"> 
      <Setter Property="Background" Value="#1AFFFFFF" /> 
      <Setter Property="BorderThickness" Value="0"/> 
     </Style> 
     <Style TargetType="{x:Type ColumnDefinition}"> 
      <Setter Property="Width" Value="10"/> 
     </Style> 
    </ListView.Resources> 

    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Naziv podjetja" DisplayMemberBinding="{Binding nazivPodjetja}"/> 
      <GridViewColumn Header="Ime" DisplayMemberBinding="{Binding ime}" Width="25"/> 
      <GridViewColumn Header="Priimek" DisplayMemberBinding="{Binding priimek}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
      <GridViewColumn Header="Naslov" DisplayMemberBinding="{Binding naslov}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
      <GridViewColumn Header="Pošta" DisplayMemberBinding="{Binding posta}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
      <GridViewColumn Header="Mobilna številka" DisplayMemberBinding="{Binding mobilnaSt}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
      <GridViewColumn Header="Stacionarna številka" DisplayMemberBinding="{Binding stacionarnaSt}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
      <GridViewColumn Header="E-naslov" DisplayMemberBinding="{Binding eMail}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
      <GridViewColumn Header="Skupina" DisplayMemberBinding="{Binding skupina}" Width="{Binding ActualWidth, ElementName=helperField}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

それは動作します、ありがとう!また、私が望むように、選択を削除しません。なぜこのインターフェースが必要なのですか?私の知る限りでは、そのような出来事を誘発する財産について理解していますか?申し訳ありませんが、私はC#にたった1年です:) – someone1

+0

MSDNのドキュメントに記載されているように、バインドされたクライアントとデータソース間のバインディングで通知を変更する必要があります。https:// msdn .microsoft.com/ja-us/library/system.componentmodel.inotifypropertychanged(v = vs.110).aspx – mm8

+0

Allrightはそれを調べます。私がした、それは私が担当者のしきい値に達すると、表示されます、と思います。 :) – someone1

関連する問題