在WPF ListView中隐藏ListViewItem
如何在绑定的ListView中隐藏ListViewItem?注意:我不想删除它。使用带有触发器的样式将项目可见性设置为折叠。在WPF ListView中隐藏ListViewItem,wpf,Wpf,如何在绑定的ListView中隐藏ListViewItem?注意:我不想删除它。使用带有触发器的样式将项目可见性设置为折叠。 <ItemsControl> <ItemTemplate> <DataTemplate> <Image Visibility='{Binding Converter=my:MaybeHideThisElementConverter}' /> </Image> </DataTemplat
<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被推到资源中,那么您就有了一个非常有效的观点。