C# 在WPF ListView中隐藏项
我有一个WPF XAML ListView,它包含一个带有两个GridViewColumns的GridView。 ListView将其ItemsSource绑定到我的类,如下所示:C# 在WPF ListView中隐藏项,c#,wpf,listview,C#,Wpf,Listview,我有一个WPF XAML ListView,它包含一个带有两个GridViewColumns的GridView。 ListView将其ItemsSource绑定到我的类,如下所示: <ListView Name="MyListView" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type mynameSpace:MyClass}}, Path=ItemsSource}
<ListView Name="MyListView" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type mynameSpace:MyClass}}, Path=ItemsSource}" >
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource ListViewItemStyle}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<!--<Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"></Setter>-->
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
// blah blah
</GridView>
</ListView>
我试图基于IsEnabled属性隐藏ListView项,因此我尝试了上述两种方法,但都不起作用,因为该项仍显示在ListView中:
<Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"></Setter>
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
如何在这样的列表视图中隐藏项目?而不是:
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
另外,不要忘记写下以下内容,其中XXX是作为用户控件、窗口等的当前视图:
<XXX.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"></BooleanToVisibilityConverter>
</XXX.Resources>
编辑1
不要忘了使用ViewModelLocator将正确的ViewModel链接为视图中的DataContext,如:
<XXX
...
DataContext="{Binding MyCustomViewModel, Mode=OneWay, Source={StaticResource Locator}}"
...>
在App.xaml中将定位器设置为ResourceDictionary的位置:
...
<ResourceDictionary>
...
<XX:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
...
</ResourceDictionary>
...
实际上,有一种替代方法不涉及任何XAML代码或集合本身 通过利用源集合的CollectionView,您可以过滤项目并执行其他操作,如排序和分组,而无需更改视图或模型。因为在wpf中,ui元素从不直接访问集合,而是通过集合视图访问集合。该集合视图继承自ICollectionView,可以自动设置,也可以由程序员设置 要进入默认集合视图,请在初始化数据时使用以下代码
var collectionView = CollectionViewSource.GetDefaultView(<List>);
collectionView.Filter = o => o.IsEnabled;
编辑:
Nervermind,我没有看到对基于xaml的解决方案的要求。IsEnabled属性在哪里定义,ListViewItemStyle是如何定义的,以及您使用的转换器是什么
您尚未提供问题的可复制示例,但您可以参考以下示例代码,该代码确实按照预期在ListView中隐藏了三项中的第二项:
public class DataItem
{
public bool IsEnabled { get; set; }
}
...
public MainWindow()
{
InitializeComponent();
MyListView123.ItemsSource = new List<DataItem>
{
new DataItem() { IsEnabled = true }, new DataItem() { IsEnabled = false }, new DataItem() { IsEnabled = true }
};
}
如果要绑定到ICollectionView,可以在viewmodel中筛选视图。-这是一个可行的解决方案吗?我必须在XAML中执行此操作,因为我正在切换ControlTemplates,不想使用filter方法。您是否验证了绑定是否正确,以及是否使用了Snoop或XamlSpy之类的工具?
var collectionView = CollectionViewSource.GetDefaultView(<List>);
collectionView.Filter = o => o.IsEnabled;
public class DataItem
{
public bool IsEnabled { get; set; }
}
...
public MainWindow()
{
InitializeComponent();
MyListView123.ItemsSource = new List<DataItem>
{
new DataItem() { IsEnabled = true }, new DataItem() { IsEnabled = false }, new DataItem() { IsEnabled = true }
};
}
<ListView Name="MyListView123">
<ListView.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibility" />
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding IsEnabled}" />
</GridView>
</ListView.View>
</ListView>