2017-02-06 5 views
1

Я пытаюсь отфильтровать элементы ListView на основе входного текста, а поскольку выбор удален, я пытаюсь установить visibilty на невидимое на основе логического (надеюсь, что это не удалит выбор элементов)ListView item visibility на основе boolean

Я использовал некоторые старые сообщения, чтобы создать этот код, но я не могу понять, почему он не работает:

<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

Обратите внимание, что я не использую привязку данных. Что мне не хватает?

+0

реализовать ли класс Oseba интерфейс INotifyPropertyChanged? – mm8

+0

В ссылке он использует '', не может найти это в вашем коде. 'O.visible' ничего не делает, я думаю .. –

+0

это не так. Как я могу это реализовать? Я думал, что достаточно установить свойство, так как я не нашел дополнительного кода в этом сообщении – someone1

ответ

1

Убедитесь, что Oseba класса реализует интерфейс INotifyPropertyChanged и поднимает PropertyChanged события в инкубаторе в visible собственности:

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)); 
    } 
} 

Это необходимо для триггера данных в вашем ListViewItem стиле, чтобы получить срабатывает динамически.

Вы также должны установить ItemContainerStyle свойство ListView к пользовательскому стилю с DataTrigger:

<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# :) – someone1

+0

Требуется для изменения уведомления об обнаружении в привязке между связанным клиентом и источником данных, как указано в документации по MSDN: https: // msdn .microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged (v = vs.110) .aspx – mm8

+0

Все будет в порядке. Я сделал, это покажет, как только я доберусь до порога репутации. :) – someone1