在WPF ListView中隐藏ListViewItem

shi*_*i14 3 wpf

如何在绑定的ListView中隐藏ListViewItem?注意:我不想删除它.

Jer*_*xon 10

是的,这很容易.

您需要做的第一件事是向要绑定的类添加属性.例如,如果您使用FirstName和LastName绑定到User类,只需添加一个布尔IsSupposedToShow属性(当然,您可以使用您喜欢的任何属性).像这样:

class User: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string FirstName { get; set; }
    public string LastName { get; set; }

    private bool m_IsSupposedToShow;
    public bool IsSupposedToShow
    {
        get { return m_IsSupposedToShow; }
        set
        {
            if (m_IsSupposedToShow == value)
                return;
            m_IsSupposedToShow = value;
            if (PropertyChanged != null)
                PropertyChanged(this, 
                    new PropertyChangedEventArgs("IsSupposedToShow"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,记住,要隐藏一些项目,不要在UI中执行 - 不不不!在数据中做到这一点.我的意思是,查找要隐藏的用户记录并在后台更改其中的属性(如在视图模型中) - 让UI做出反应.使XAML服从数据.

像这样:

<DataTemplate DataType="{x:Type YourType}">
    <DataTemplate.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSupposedToShow}" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataTemplate.Resources>
    <!-- your UI here -->
    <TextBlock> 
        <TextBlock.Text> 
        <MultiBinding StringFormat="{}{0}, {1}"> 
            <Binding Path="LastName" /> 
            <Binding Path="FirstName" /> 
        </MultiBinding> 
        </TextBlock.Text>
    </TextBlock>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

当您将IsSupposedToShow更改为false时,XAML会理解它应该更改整个DataTemplate的可见性.这一切都由WPF和presto为您联系,这是您想要的问题!

祝你好运!

  • 我觉得我错过了什么.XAML使项目的文本消失,但不是列表中的项目. (3认同)

Rob*_*ney 6

我遵循的方法,从最可取到最不可取:

  • 在 中ListView.ItemContainerStyle,使用基于绑定属性DataTrigger进行设置Visibility
  • 如果您从资源字典中获取默认模板,请在ItemTemplate或 中DataTemplate为项目使用样式。
  • ItemsSourcefor设置为ListViewa CollectionView,并在代码隐藏中处理CollectionView'sFilter事件。有关详细信息,请参阅MSDN 对集合视图的讨论
  • 维护一个单独ObservableCollectionItemsSourceforListView并根据需要添加/删除项目。

在任何情况下ValueConverter我都不会使用 a ,因为我可能对他们有一种非理性的厌恶。

我认为使用 aCollectionView可能是最正确的方法,但它们有点不雅,因为您必须编写一个事件处理程序来实现过滤。


Joe*_*csy 2

使用带有触发器的样式将项目可见性设置为折叠。