【问题标题】:How do I hide a TableSection with XAML in Xamarin Forms?如何在 Xamarin 表单中使用 XAML 隐藏 TableSection?
【发布时间】:2017-02-08 00:28:05
【问题描述】:

我最近一直在为一个项目使用 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 属性不起作用并引发异常,因为它不存在(它存在于标签等其他元素上)。我还尝试使用VisualElement.IsVisible,它会抛出一个无效的强制转换异常。那么有什么办法可以隐藏这个部分吗?

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

【问题讨论】:

  • 恐怕我没有尽可能多地使用 xamarin,但如果它带有通用 xaml 标准,它将是 Visibility 属性,您可以将您的 bool 通过转换器用于可以是 VisibleCollapsed 作为参数。 IE; Visibility="Collapsed"
  • 谢谢,但是,Xamarin Forms 使用自己的自定义控件,并且 Visibility 属性不可用。表单在运行时被翻译成原生控件。
  • 真的吗?好吧,这令人失望。想知道自从 MS 购买它们后,他们是否可能会尝试采用一些长期的标准约定。当我有时间时,将不得不更多地修补 xamarin。干杯

标签: xaml mvvm xamarin xamarin.forms


【解决方案1】:

您已经遇到了使用 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);
}

【讨论】:

  • 我会将此标记为答案。我实际上打算按照自己的意愿弯曲网格,但这在技术上是一个答案。
  • 是的,控件没有内置选项并不是很好
猜你喜欢
  • 2021-09-23
  • 2019-04-02
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多