首页 文章

如何在Xamarin Forms中使用XAML隐藏TableSection?

提问于
浏览
0

我最近在一个项目中使用Xamarin Forms,我一直在使用TableView来显示从web api检索到的记录的详细信息 . 有时,某些细节不存在,所以我想隐藏显示信息的部分 .

但是,我找不到隐藏TableSection的方法 .

这是一些XAML:

<TableView>
    <TableRoot>

        ...

        <!--Contact info-->
        <TableSection IsVisible="{Binding HasContact}" Title="Contact">

          <!--Contact name-->
          <TextCell Text="{Binding ContactName}" Detail="Primary contact" />

          <!--Phone-->
          <TextCell Text="Phone"
                    Detail="{Binding FormattedContactPhoneNumber}"
                    Command="{Binding BindingContext.DialPhoneCommand, Source={x:Reference MainGrid}}"
                    CommandParameter="{Binding ContactPhoneNumber}"/>


          <!--Email-->
          <TextCell Text="Email"
                    Detail="{Binding ContactEmail}"
                    Command="{Binding BindingContext.SendEmailCommand, Source={x:Reference MainGrid}}"
                    CommandParameter="{Binding ContactEmail}"/>

        </TableSection>
    </TableRoot>
</TableView>

显然,IsVisible属性并不存在(它存在于像Labels这样的其他元素上) . 我也尝试使用 VisualElement.IsVisible 抛出无效的强制转换异常 . 那么有什么方法可以隐藏这一部分吗?

如果没有办法做到这一点,也许我需要走一条更脏的路径并使用单独的TableViews(我可以使用VisualElement.IsVisible):(

1 回答

  • 2

    您已经遇到了使用TableView的一个缺点,无法通过可绑定属性动态隐藏节 .

    在我的项目中,我解决了这个问题:

    在页面后面的代码中,我监听用作BindingContext的ViewModel的OnPropertyChanges . 当需要的布尔值更改时,我删除了TableSection中不再需要的单元格 . 当再次需要Cell时,我再次插入它 .

    因此,请命名所有部分和单元格,并在页面开始时获取需要更改的单元格,以便以后删除和添加它们 .

    小例子代码

    private void OnViewmodelPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName.Equals("IsBioSecurityAvailable", StringComparison.OrdinalIgnoreCase))
        {
            AdjustBioSecurityHeight();
        }
    }
    
    private void AdjustBioSecurityHeight()
    {
        if (!_viewmodel.IsBioSecurityAvailable && GeneralSection.Contains(BioSecurityViewCell))
            GeneralSection.Remove(BioSecurityViewCell);
    }
    

相关问题