我有一个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();
}
}
答案 0 :(得分:1)
您可以将您的收藏集(SveHale.Hala1
)包装在CollectionView中,并基于按钮状态使用Filter属性。例如,如果您的按钮状态绑定到FilterData
集合的属性Hala1Wrapper
和SveHale.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}">