隐藏WPF ListView

时间:2017-03-30 13:23:09

标签: 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.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}}"/>

如何隐藏列表视图中的项目?

3 个答案:

答案 0 :(得分:0)

而不是:

<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>

写下这个:

<Setter Property="Visibility" Value="{Binding IsEnabled, Converter={StaticResource BoolToVisibility}, Mode=TwoWay}"/>

确保在ViewModel中有 RaisePropertyChanged(&#34; IsEnabled&#34;);

    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;

            RaisePropertyChanged("IsEnabled");
        }
    }

另外,不要忘记写这个&#34; XXX&#34;是您当前的View作为UserControl,Window等等:

<XXX.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis"></BooleanToVisibilityConverter>
</XXX.Resources>

编辑1

不要忘记将ViewModel作为DataContext链接到View中(使用ViewModelLocator),如:

<XXX
    ...
    DataContext="{Binding MyCustomViewModel, Mode=OneWay, Source={StaticResource Locator}}"
      ...>

您的定位器在App.xaml中设置为ResourceDictionnary:

...
<ResourceDictionary>
   ...
   <XX:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
   ...
</ResourceDictionary>
...

答案 1 :(得分:0)

实际上有一种替代方法可以解决任何XAML代码或集合本身。

通过利用源集合的CollectionView,您可以过滤项目(并执行其他操作,如排序和分组),而无需更改视图或模型。因为在wpf ui元素中永远不会直接访问集合,而是通过集合视图。该集合视图继承自ICollectionView,可以自动设置,也可以由程序员设置。

要初始化数据,要进入默认集合视图,请在某处使用以下代码。

var collectionView = CollectionViewSource.GetDefaultView(<List>);
collectionView.Filter = o => o.IsEnabled;

编辑: Nervermind,我没有看到基于xaml的解决方案的要求。

答案 2 :(得分:0)

IsEnabled属性定义在哪里,你的&#34; ListViewItemStyle&#34;定义和你使用的转换器?

您还没有提供可重现的问题示例,但您可以参考以下示例代码,该代码会按预期隐藏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 }
    };
}
<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>

enter image description here