如何在Xamarin表单中隐藏带有XAML的表节?

如何在Xamarin表单中隐藏带有XAML的表节?,xaml,mvvm,xamarin,xamarin.forms,Xaml,Mvvm,Xamarin,Xamarin.forms,我最近一直在为一个项目使用Xamarin表单,我一直在使用TableView显示从web api检索到的记录的详细信息。有时,某些细节不存在,所以我想隐藏显示信息的部分 但是,我找不到隐藏表部分的方法 以下是一些XAML: <TableView> <TableRoot> ... <!--Contact info--> <TableSection IsVisible="{Binding HasCo

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

但是,我找不到隐藏表部分的方法

以下是一些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属性不起作用,并抛出异常,因为它不存在(它存在于标签等其他元素上)。我还尝试使用了
VisualElement.IsVisible
,它抛出了一个无效的强制转换异常。有没有办法隐藏这一部分


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

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

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

在页面的代码隐藏中,我监听用作BindingContext的ViewModel的OnPropertyChanges。 当所需的布尔值发生变化时,我将删除TableSection中不再需要的单元格。 当再次需要该单元格时,我会再次插入它

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

小示例代码

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);
}

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

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

在页面的代码隐藏中,我监听用作BindingContext的ViewModel的OnPropertyChanges。 当所需的布尔值发生变化时,我将删除TableSection中不再需要的单元格。 当再次需要该单元格时,我会再次插入它

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

小示例代码

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);
}

恐怕我还没有像我所希望的那样与xamarin一起工作,但是如果它带有通用的xaml标准,那么它将是
可见性
属性,您可以将您的bool通过一个转换器,使其作为参数
可见
折叠
谢谢,但是,Xamarin表单使用自己的自定义控件,而Visibility属性不可用。表单在运行时被转换为本机控件。真的吗?这太令人失望了。不知道自从MS购买了表单之后,他们是否会尝试采用一些长的标准约定。当我有了ti时,他们将不得不对Xamarin进行更多的修改我。干杯我恐怕没有像我所希望的那样与xamarin合作,但是如果它带有通用的xaml标准,那么它将是
可见性
属性,您可以将您的bool通过一个转换器,使其作为参数
可见
折叠
谢谢,但是,Xamarin表单使用自己的自定义控件,而Visibility属性不可用。表单在运行时被转换为本机控件。真的吗?这太令人失望了。不知道自从MS购买了表单之后,他们是否会尝试采用一些长的标准约定。当我有了ti时,他们将不得不对Xamarin进行更多的修改我。干杯。我会把这标记为一个答案。我实际上会按照我的意愿弯曲网格,但这在技术上是一个答案。是的,控制没有内置选项不太好。我会将这标记为一个答案。我实际上会按照我的意愿弯曲网格,但这在技术上是一个答案。是的,这不太好ol没有内置选项