C# ListViewItem的绑定可见性
我正在为Windows Phone 8.1开发一个应用程序。在该应用程序中,我想将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
可观察集合
的项目绑定到列表视图
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>