C# ListViewItem的绑定可见性

C# ListViewItem的绑定可见性,c#,xaml,listview,winrt-xaml,C#,Xaml,Listview,Winrt Xaml,我正在为Windows Phone 8.1开发一个应用程序。在该应用程序中,我想将可观察集合的项目绑定到列表视图DisruptionDisplayElement有一个名为bool IsFavorite的属性。在列表视图中,我想隐藏所有项目,其中IsFavorite为false。 如果我使用ItemContainerStyle并使用转换器将Visibility-属性设置为collapsed,则该属性不起作用。如果我用同样的方法定义背景色进行测试,它就会工作。 我还可以隐藏网格,ListViewIt

我正在为Windows Phone 8.1开发一个应用程序。在该应用程序中,我想将
可观察集合
的项目绑定到
列表视图
DisruptionDisplayElement
有一个名为
bool IsFavorite
的属性。在列表视图中,我想隐藏所有项目,其中
IsFavorite
为false。 如果我使用
ItemContainerStyle
并使用转换器将
Visibility
-属性设置为collapsed,则该属性不起作用。如果我用同样的方法定义背景色进行测试,它就会工作。 我还可以隐藏网格,
ListViewItem
的所有内容都在网格中,但在这种情况下,我仍然保留了
ListViewItem
的装饰,它占用大约50像素的空间

以下是我得到的:

XAML:

中断显示元素:

public class DisruptionDisplayElement
{
    public string Message { get; set; }

    public bool IsFavorite { get; set; }
}
代码隐藏:

namespace myApp
{
    public sealed partial class MainPage
    {
        public MainPage()
        {
            InitializeComponent();

            DataContext = new ViewModel;
        }
    }
}
我的“视图模型”-类:

名称空间myApp
{
公共类视图模型
{
公共ObserverableCollection中断显示列表{get;set;}
公共视图模型()
{
DistributionDisplayList=新的ObservableCollection();
添加(新的中断显示元素(){IsFavorite=true,Message=“Message 1”});
添加(新的中断显示元素(){IsFavorite=false,Message=“Message 2”});
添加(新的中断显示元素(){IsFavorite=true,Message=“Message 3”});
}
}
}
如果将网格隐藏在其中,如何隐藏ListViewItem而不浪费emtpy ListViewItems的所有空间

编辑: 高级代码提供了

如果没有,就不可能提供一个实际的代码示例,在您的具体场景中显示正确的技术

但是,基本的答案是,您应该使用
ICollectionView
根据某些属性过滤视觉表示

有多种方法可以做到这一点。最简单的方法之一是将筛选应用于数据源的默认视图。这样的视图总是存在的,如果您只是将数据源绑定到单个可视对象,或者希望以相同的方式过滤显示该数据源的所有可视对象,那么获取和修改此视图是正确的方法

例如:

ICollectionView view = CollectionViewSource.GetDefaultView(DisruptionDisplayList);

view.Filter = item => ((MyClass)item).IsFavorite;
您可以在适当的时间在代码中配置此视图,例如,当用户通过您提供的任何输入机制指示他们只想显示喜爱的项目时


注意,这种方法避免了将
DataTemplate
用作显示或隐藏项的机制。相反,在项目到达
ListView
对象之前会对其进行过滤。

如果要查找UWP,只需将MinHeight属性设置为0(零):



嗨,彼得,谢谢你的回答。很遗憾,Windows Phone上未提供CollectionViewSource.GetDefaultView:[link]()。我找不到使用Windows Phone下的过滤器的方法。所以我尝试了可见性选项。我上面提到的结果。我在我的第一个线程中升级了我的代码。你的问题用WPF标记。如果没有使用WPF,则不应使用WPF标记。有关如何在Winrt API中完成过滤行为的建议,请参阅。好的,谢谢。我没有想到,WPF不是WinRT,但它是有道理的。但回到主题:你在链接帖子中的解决方案很有魅力!谢谢
namespace myApp
{
    public sealed partial class MainPage
    {
        public MainPage()
        {
            InitializeComponent();

            DataContext = new ViewModel;
        }
    }
}
namespace myApp
{
    public class ViewModel
    {
        public ObserverableCollection<DisruptionDisplayElement> DisruptionDisplayList {get;set;}

        public ViewModel()
        {
            DisruptionDisplayList = new ObservableCollection<DisruptionDisplayElement>();
            DisruptionDisplayList.Add(new DisruptionDisplayElement() { IsFavorite = true, Message = "Message 1"});
            DisruptionDisplayList.Add(new DisruptionDisplayElement() { IsFavorite = false, Message = "Message 2" });
            DisruptionDisplayList.Add(new DisruptionDisplayElement() { IsFavorite = true, Message = "Message 3" });
        }
    }
}
ICollectionView view = CollectionViewSource.GetDefaultView(DisruptionDisplayList);

view.Filter = item => ((MyClass)item).IsFavorite;
<ListView.ItemContainerStyle>
     <Style TargetType="ListViewItem">
          <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
          <Setter Property="MinHeight" Value="0" />

     </Style>
</ListView.ItemContainerStyle>