Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF ListView中隐藏项_C#_Wpf_Listview - Fatal编程技术网

C# 在WPF ListView中隐藏项

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}

我有一个WPF XAML ListView,它包含一个带有两个GridViewColumns的GridView。 ListView将其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>