在WPF ListView中隐藏ListViewItem

在WPF ListView中隐藏ListViewItem,wpf,Wpf,如何在绑定的ListView中隐藏ListViewItem?注意:我不想删除它。使用带有触发器的样式将项目可见性设置为折叠。 <ItemsControl> <ItemTemplate> <DataTemplate> <Image Visibility='{Binding Converter=my:MaybeHideThisElementConverter}' /> </Image> </DataTemplat

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

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


<ItemsControl>
 <ItemTemplate>
  <DataTemplate>
   <Image Visibility='{Binding Converter=my:MaybeHideThisElementConverter}' />
   </Image>
  </DataTemplate>
 </ItemTemplate>
</ItemsControl>
我们在这里所做的是将决策委托给您的MaybeHideThisElementConverter实现。如果对象的用户属性为null,或者计数为偶数,或者应用程序需要的任何自定义逻辑,则可以在此处返回Collapsed。转换器将一个接一个地传递给集合中的每个项目,您可以返回Visibility.collapped或Visibility.Visibility(可视性)。根据具体情况进行显示。

是的,这很简单

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

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"));
        }
    }
}
然后,请记住,要隐藏某些项目,不要在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>

当您将IsSupposedToShow更改为false时,XAML理解它应该更改整个数据模板的可见性。WPF和presto都为你准备好了,这就是你想问的问题


祝你好运

我将遵循的方法,从最理想到最不理想:

  • ListView.ItemContainerStyle
    中,使用
    DataTrigger
    根据绑定属性设置
    可见性
  • 如果要从资源字典中获取默认模板,请在
    ItemTemplate
    DataTemplate
    中为项目使用样式
  • 列表视图
    项资源
    设置为
    集合视图
    ,并在代码隐藏中处理
    集合视图
    过滤器
    事件。有关详细信息,请参阅
  • 列表视图
    维护一个单独的
    可观察集合
    作为
    项目资源
    ,并根据需要添加/删除项目
在任何情况下,我都不会使用
ValueConverter
,因为我可能对它们有一种非理性的厌恶


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

本页给出了我需要的答案:(请参阅“过滤”一节)

哇,比XAML简单多了

例如:

bool myFilter(object obj)
{
    // Param 'obj' comes from your ObservableCollection<T>.
    MyClass c = obj as MyClass;
    return c.MyFilterTest();
}

// apply it
myListView.Items.Filter = myFilter;
// clear it
myListView.Items.Filter = null;
bool myFilter(对象对象对象)
{
//参数“obj”来自您的ObservableCollection。
MyClass c=对象j作为MyClass;
返回c.MyFilterTest();
}
//应用它
myListView.Items.Filter=myFilter;
//清除它
myListView.Items.Filter=null;

永远隐藏它?还是在采取行动之后?更多的细节将是好的…因为我有一个列表视图B索引到一个列表。如果我想从listview中删除一个项目,我必须从列表中删除它。所以我不想那样。我认为最好不要只是隐藏它。记住标记正确的答案。可能是你应该使用DataTrigger。除非你在
User
类中实现了
INotifyPropertyChanged
并在
IssuppedToshow
更改时引发
PropertyChange
,否则这不会动态工作。(还有,我想把这个属性命名为
IsVisible
)@robertrossney,Welp:S你是对的。我更新了代码以反映您的观点。我真的不想写生产准备,但这是一个简单的事情,以补充一个后续问题的一步。接得好。我觉得我错过了什么。XAML使项目的文本消失,但不是列表中的项目。我喜欢你的写作风格,它非常受欢迎。回答得也很好+1为什么DataTemplate中的样式触发器没有出现在您的列表中?这似乎是最简单的方法。确实如此!这是第二项。默认情况下,我倾向于使用
ItemContainerStyle
。它同样简单,也意味着行为被本地化到
列表视图中。当
数据模板
未在
列表视图
中本地定义时,这可能是一个重要的区别。是的,我明白你的观点并同意。但是,在datatemplate中为itemtemplate定义的样式也是本地的,以挑出细节。但是如果datatemplate被推到资源中,那么您就有了一个非常有效的观点。