基于boolean的ListView项目可见性 [英] ListView item visibility based on boolean

查看:51
本文介绍了基于boolean的ListView项目可见性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图根据输入文本过滤ListView项,并且由于删除了选择项,因此我试图基于布尔值将可见性设置为不可见(我希望这不会删除项的选择)

I am trying to filter ListView Items based on input text, and because the selection is removed, I am trying to set visibilty to invisible based on a boolean(I hope this wont remove the selection of items)

我使用了一些较早的文章来创建此代码,但是我不知道为什么它不起作用:

I used some older posts to create this code, but I can't figure out why it isn't working:

 <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>

文本过滤器方法(可以正常工作):

Text filter method(which is working fine):

  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 { }
    }

我在这里找到了代码

请注意,我没有使用任何数据绑定.我想念什么?

Note that I am not using any data binding. What am I missing?

推荐答案

确保Oseba类实现INotifyPropertyChanged接口并在visible属性的设置器中引发PropertyChanged事件:

Make sure that the Oseba class implements the INotifyPropertyChanged interface and raises the PropertyChanged event in the setter of the visible property:

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样式的数据触发器动态触发所必需的.

This is required for the data trigger in your ListViewItem style to get triggered dynamically.

还应该使用DataTriggerListViewItemContainerStyle属性设置为自定义样式:

You should also set the ItemContainerStyle property of the ListView to your custom style with the 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>

这篇关于基于boolean的ListView项目可见性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆