完全隐藏GridView中的元素(用作ListView的视图)?

时间:2013-05-24 10:38:09

标签: c# wpf listview converter visibility

我有一个ListView和一个按钮。现在,当我按下按钮时,我想只显示符合要求标准的元素。我正在使用转换器来查看项目的可见性,但如果我返回Visibility.Hidden项目只是不可见,但它们仍占用空间。一个更好的选择是使用缩小项目并隐藏它们的Visibility.Collapsed,但它们仍会占用一些空间。我需要他们完全离开ListView

这是XAML代码(我知道它不是很干净,但是因为我有一个宽监视器,所以行比列更容易):

        <ListView x:Name="lvTereni1" Grid.Column="0" Grid.Row="0" dd:DragDrop.IsDropTarget="True" dd:DragDrop.DropHandler="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Width="120" Margin="5" OpacityMask="#CA000000" SelectionMode="Single" ItemsSource="{Binding Path=SveHale.Hala1}" GridViewColumnHeader.Click="lvTereni1_Click" MouseDoubleClick="ListView_MouseDoubleClick">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Glavna sala" Width="110">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Border Height="40" Width="80" CornerRadius="15">
                                    <Border.Visibility>
                                        <MultiBinding Converter="{StaticResource ShowHideConverter}">
                                            <MultiBinding.Bindings>
                                                <Binding Path="BZauzet" />
                                                <Binding Path="Stanje" />
                                                <Binding ElementName="btnSwap" Path="Text"></Binding>
                                            </MultiBinding.Bindings>
                                        </MultiBinding>
                                    </Border.Visibility>
                                    <Border.Background>
                                        <MultiBinding Converter="{StaticResource DragAndDropCoverter}">
                                            <MultiBinding.Bindings>
                                                <Binding ElementName="lvTimovi" Path="SelectedItem" />
                                                <Binding Path="Stanje"/>
                                                <Binding Path="DozvoljeniSportovi" />
                                                <Binding Path="BZauzet" />
                                            </MultiBinding.Bindings>
                                        </MultiBinding>
                                    </Border.Background>
                                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Path=Sifra}">
                                        <TextBlock.Foreground>
                                            <MultiBinding Converter="{StaticResource DragAndDropTextCoverter}">
                                                <MultiBinding.Bindings>
                                                    <Binding Path="Stanje"/>
                                                    <Binding Path="BZauzet" />
                                                </MultiBinding.Bindings>
                                            </MultiBinding>
                                        </TextBlock.Foreground>
                                    </TextBlock>
                                </Border>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

ShowHideConverter是这里有趣的转换器(我知道我不应该将转换器绑定到与按钮文本相关的东西,但这不是一个大项目,并且按钮的文本块将始终具有两种状态,因此......):

class ShowHideConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        bool zauzet = (bool)value[0];
        Teren._Stanje stanje = (Teren._Stanje)value[1];
        string ispis = (string)value[2];
        if (ispis.Equals("Prikaži sve"))
            if (zauzet || stanje == Teren._Stanje.Zatvoren)
                return Visibility.Collapsed;
        return Visibility.Visible;
    }

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

1 个答案:

答案 0 :(得分:1)

您可以将您的收藏集(SveHale.Hala1)包装在CollectionView中,并基于按钮状态使用Filter属性。例如,如果您的按钮状态绑定到FilterData集合的属性Hala1WrapperSveHale.Hala1包装:

public bool FilterData 
{
    set 
    {
        if (value) 
            Hala1Wrapper.Filter = itm => zauzet || ((Teren._Stanje)itm) == Teren._Stanje.Zatvoren;
        else 
            Hala1Wrapper.Filter = null;
    }
}

在XAML中,您必须将ListView ItemsSource绑定到CollectionView包装器。

<ListView  ItemsSource="{Binding Path=SveHale.Hala1Wrapper}">