在ListView中隐藏视图单元格

时间:2019-10-25 15:58:43

标签: xamarin.forms

我将一个listview进行了分组,每当我触摸分组标题时,该分组中的所有项目都会隐藏,但是由于某些原因,单元格仍会保留

我试图为ViewCell中的所有元素设置一个绑定的IsVisible属性,但仍然无法使其工作

这里是我的ListView xaml代码:

<ListView x:Name="GroupsList"
                      ItemsSource="{Binding Dishes}"
                      IsGroupingEnabled="True"
                      SeparatorColor="Black"
                      SeparatorVisibility="Default"
                      HasUnevenRows="True"
                      GroupShortNameBinding="{Binding Key}">
                <ListView.GroupHeaderTemplate>
                    <DataTemplate>
                        <ViewCell Height="50">
                            <StackLayout
                                VerticalOptions="FillAndExpand"
                                BackgroundColor="LightSlateGray">
                                <Button BackgroundColor="Transparent"
                                        BorderColor="Transparent"
                                        BorderWidth="0"
                                        Text="{Binding Key}"
                                        TextColor="White"
                                        HorizontalOptions="StartAndExpand"
                                        Command="{Binding BindingContext.SelectGroupHeader, Source={x:Reference DishesPage}}"
                                        CommandParameter="{Binding Key}"
                                        ContentLayout="Right, 300"
                                        ImageSource="next_disclosure"></Button>
                            </StackLayout>
                        </ViewCell>
                </DataTemplate>
                </ListView.GroupHeaderTemplate>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ContentView Padding="2, 5, 5, 0"
                                         IsVisible="{Binding IsVisible}">
                                <Frame Padding="2"
                                       HasShadow="False"
                                       BackgroundColor="White">
                                    <StackLayout Orientation="Horizontal">
                                        <Label Margin="10"
                                               Text="{Binding Name}"
                                               TextColor="Black"
                                               FontSize="Medium"
                                               HorizontalOptions="StartAndExpand"></Label>
                                    </StackLayout>
                                </Frame>
                            </ContentView>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

这是我的ViewModel代码:

private async Task SelectedGroupHeader(string item)
        {
            foreach(var group in Dishes)
            {
                if(item == group.Key)
                {
                    foreach(var dish in group)
                    {
                        if (dish.IsVisible)
                        {
                            dish.IsVisible = false;
                        }
                        else
                        {
                            dish.IsVisible = true;
                        }
                    }
                }
            }
        }

隐藏之前: enter image description here

隐藏后 enter image description here

1 个答案:

答案 0 :(得分:1)

问题在于,您要隐藏时将ContentView.IsVisible设置为false,但是当您隐藏ContentView项目仍保留在列表中,因此您仍然可以看到这些项目,但没有ContentView(空白)!

我发现可以实现目标的一种方法是将被点击的组的项目存储在某处,并在点击时清除其内容。执行此操作后,该组将变为空,因此ListView中的项目将不再可见。当您再次点击组标题时,您会再次向该组添加项目,以便ListView再次显示您的项目。

我正在工作的代码大致如下:

XAML 中,我仅删除了与ContentView.IsVisible的绑定:

<ListView x:Name="GroupsList"
                  ItemsSource="{Binding Dishes}"
                  IsGroupingEnabled="True"
                  SeparatorColor="Black"
                  SeparatorVisibility="Default"
                  HasUnevenRows="True"
                  GroupShortNameBinding="{Binding Key}">
            <ListView.GroupHeaderTemplate>
                <DataTemplate>
                    <ViewCell Height="50">
                        <StackLayout
                            VerticalOptions="FillAndExpand"
                            BackgroundColor="LightSlateGray">
                            <Button BackgroundColor="Transparent"
                                    BorderColor="Transparent"
                                    BorderWidth="0"
                                    Text="{Binding Key}"
                                    TextColor="White"
                                    HorizontalOptions="StartAndExpand"
                                    Command="{Binding BindingContext.SelectGroupHeader, Source={x:Reference DishesPage}}"
                                    CommandParameter="{Binding Key}"
                                    ContentLayout="Right, 300"
                                    ImageSource="next_disclosure"></Button>
                        </StackLayout>
                    </ViewCell>
            </DataTemplate>
            </ListView.GroupHeaderTemplate>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ContentView Padding="2, 5, 5, 0">
                            <Frame Padding="2"
                                   HasShadow="False"
                                   BackgroundColor="White">
                                <StackLayout Orientation="Horizontal">
                                    <Label Margin="10"
                                           Text="{Binding Name}"
                                           TextColor="Black"
                                           FontSize="Medium"
                                           HorizontalOptions="StartAndExpand"></Label>
                                </StackLayout>
                            </Frame>
                        </ContentView>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

在您的 ViewModel 中,您必须执行以下操作:

private async Task SelectedGroupHeader(string item)
    {
        foreach(var group in Dishes)
        {
            if(item == group.Key)
            {
                if(!group.IsHidden)
                {
                    group.Clear();
                    group.IsHidden = true; // This is simply a flag you can set in your group class to keep track of if the group is collapsed or not
                }
                else
                {
                    AddItemsToGroup(group)// Add this group all the elements that belongs to it.

                    group.IsHidden = false;
                }
            }
        }
    }

我希望这会有所帮助!

注意:仅当您的项目集合为ObservableCollection时,此方法才有效,以便在集合更改时通知ListView