2016-09-29 3 views
0

Я работал в Xamarin Forms в последнее время для проекта, и я использую TableView для отображения деталей записи, извлеченной из web api. Иногда некоторых деталей нет, поэтому я хотел бы скрыть раздел, который отображает информацию.Как скрыть таблицу с XAML в Xamarin Forms?

Однако я не могу найти способ скрыть 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) :(

+0

Я боюсь, что я не работал с Xamarin столько, сколько я хотел бы, но если она несет общие стандарты Xaml было бы 'Visibility' собственности вы бы поставить Ьоо через конвертер для того, чтобы быть «видимым» или «свернутым» в качестве параметра. то есть; 'Visibility =" Collapsed "' –

+0

Спасибо, однако, Xamarin Forms использует свои собственные настраиваемые элементы управления, а свойство Visibility недоступно. Формы преобразуются в собственные элементы управления во время выполнения. – Eric

+0

Действительно? Это неутешительно. Интересно, что, поскольку MS купила их, они могут попытаться принять некоторые из стандартных условных соглашений. Прийдется снова похудеть с ксамарином. Cheers –

ответ

2

Ну вы попали . один недостаток использования TableView, не будучи в состоянии скрыть разделы динамически через привязываемые свойства

в моем проекте я решил это так:

в коде позади страницы я слушать OnPropertyChanges в ViewModel который используется как BindingContext. Когда необходимые логические изменения, я удалю ячейку, которая больше не требуется в 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); 
} 
+0

Я отмечу это как ответ. Я на самом деле собираюсь идти по пути изгиба сетки к моей воле, но это технически ответ. – Eric

+0

Да, не здорово, что элемент управления не имеет встроенной опции – Depechie

Смежные вопросы