Как динамически устанавливать видимость элементов в виде списка в xamarin forms

#xamarin.forms

#xamarin.forms

Вопрос:

Я пытаюсь создать страницу в формах Xamarin, которая имитирует стиль таблицы в HTML. Я хочу, чтобы заголовок и данные могли удаляться или отображаться в зависимости от условия. Моя проблема в том, что я не смог найти способ получить доступ к определенному свойству внутри ViewCell просмотра списка.

Мой код XAML выглядит следующим образом

  <Grid x:DataType="models:TransactionHistory" >

            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <Label Grid.Row="0"
                   Grid.Column="0"
                   Text="Tran Number"
                   x:Name="LabelTranNumber"
                   IsVisible="{Binding ShowTransactionNumberColumn}"/>
            <Label Grid.Row="0"
                   Grid.Column="1"
                   Text="Description"
                   x:Name="LabelDescription"
                   IsVisible="{Binding ShowDescriptionColumn}"/>
            <Label
                Grid.Row="0"
                Grid.Column="2"
                Text="Quantity"
                x:Name="LabelQuantity"
                IsVisible="{Binding ShowQuantityColumn}"
                />
            <Label
                Grid.Row="0"
                Grid.Column="3"
                Text="Date"
                x:Name="LabelDate"
                IsVisible="{Binding ShowDateRaisedColumn}"/>

            <Label
                Grid.Row="0"
                Grid.Column="4"
                Text="Extension"
                x:Name="LabelExtension"
                IsVisible="{Binding ShowExtensionColumn}"/>
            <ListView
                Grid.Column="0"
                Grid.Row="1"
                Grid.ColumnSpan="{Binding NumberOfVisibleColumns}"
                x:Name="ListViewTransactionHistory">
                <ListView.ItemTemplate >
                    <DataTemplate x:DataType="models:History" >
                        <ViewCell>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                </Grid.ColumnDefinitions>

                                <Label
                                    Grid.Column="0"
                                    Text="{Binding TransactionNumber}"
                                    IsVisible="{Binding??? }"/>  --- How do I access ShowTransactionNumber field here?
                                <Label Grid.Row="0"
                                       Grid.Column="1"
                                       Text="{Binding Description}" />
                                <Label

                                    Grid.Column="2"
                                    Text="{Binding Quantity}" />
                                <Label

                                    Grid.Column="3"
                                    Text="{Binding DateRaised}" />
                                <Label
                                    Grid.Column="4"
                                    Text="{Binding FormattedExtension}" />
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>

            </ListView>
        </Grid>
  

Моя модель выглядит так

 public class TransactionHistory
    {
        public bool ShowTransactionNumberColumn { get; set;  }
        public bool ShowDescriptionColumn { get; set;  }
        public bool ShowQuantityColumn { get; set;  }
        public bool ShowDateRaisedColumn { get; set;  }
        public bool ShowExtensionColumn { get; set;  }

        public int NumberOfVisibleColumns {
            get
            {
                int numberOfVisibleColumns = 0;
                if (ShowTransactionNumberColumn) numberOfVisibleColumns  ;
                if (ShowDescriptionColumn) numberOfVisibleColumns  ;
                if (ShowQuantityColumn) numberOfVisibleColumns  ;
                if (ShowDateRaisedColumn) numberOfVisibleColumns  ;
                if (ShowExtensionColumn) numberOfVisibleColumns  ;
                return numberOfVisibleColumns;
            }
        }
        public List<History> TransactionHistories { get; set; }
    }
  

Мой класс истории выглядит так

     public class History
    {
        public string TransactionNumber { get; set; }
        public string Description { get; set; }
        public decimal Quantity { get; set; }
        public string DateRaised { get; set; }
        public decimal Extension { get; set; }

        public string FormattedExtension { get; set; }
    }
  

Мой вопрос в том, как мне привязать модель истории транзакций к просмотру, чтобы мое представление списка инициализировалось с помощью TransactionHistories. И как я могу получить доступ к логическим переменным внутри ячейки, чтобы переключать видимость элемента внутри ячейки?

В коде, лежащем в основе, я могу установить источник представления списка следующим образом. Но я не смогу получить доступ к логическим значениям.

 ListViewTransactionHistory.ItemsSource = transactionHistory.TransactionHistories;
    
  

Я думаю, что я делаю что-то не так. Любая идея будет полезна. Большое спасибо 🙂

Редактировать:

В коде, лежащем в основе метода OnAppearing, я делаю это

  protected override void OnAppearing()
        {
            TransactionHistoryStore transactionHistoryStore = new TransactionHistoryStore();
            TransactionHistory transactionHistory = transactionHistoryStore.GetTransactions();

            if (transactionHistory == null) return;

            LabelTranNumber.IsVisible = transactionHistory.ShowTransactionNumberColumn;
            LabelDescription.IsVisible = transactionHistory.ShowDescriptionColumn;
            LabelDate.IsVisible = transactionHistory.ShowDateRaisedColumn;
            LabelExtension.IsVisible = transactionHistory.ShowExtensionColumn;

            // NumberOfVisibleColumns = numberOfVisibleColumns;
            ListViewTransactionHistory.ItemsSource = transactionHistory.TransactionHistories;
        }
  

Поэтому вместо настройки свойства isVisible вручную. Как я могу привязать переменную TransactionHistory.

Переменная transactionHistoryVariable выглядит следующим образом

 public TransactionHistory GetTransactions()
        {
            TransactionHistory transaction = new TransactionHistory
            {
                ShowDescriptionColumn = true,
                ShowQuantityColumn = true,
                ShowDateRaisedColumn = true,
                ShowExtensionColumn = true,
                ShowTransactionNumberColumn = true,
                TransactionHistories = new List<History>
                {
                    new History
                    {
                        DateRaised = DateTime.Now.ToShortDateString(),
                        Description = "SMITH CHIPS ",
                        Extension = 2.25M,
                        FormattedExtension = 2.25.ToString("C"),
                        Quantity = 2,
                        TransactionNumber = "1234"
                    },
                    new History
                    {
                        DateRaised = DateTime.Now.ToShortDateString(),
                        Description = "SMITH CHIPS ",
                        Extension = 2.25M,
                        FormattedExtension = 2.25.ToString("C"),
                        Quantity = 2,
                        TransactionNumber = "1234"
                    },
                    new History
                    {
                        DateRaised = DateTime.Now.ToShortDateString(),
                        Description = "SMITH CHIPS ",
                        Extension = 2.25M,
                        FormattedExtension = 2.25.ToString("C"),
                        Quantity = 2,
                        TransactionNumber = "1234"
                    }
                }
            };

            return transaction;
        }
  

Ответ №1:

Если я понял ваш вопрос.

  • В вашем XAML настройте ListView ItemsSource={Привязка TransactionHistories} (похоже, вы уже установили привязку страницы)
  • Чтобы получить доступ к привязке страницы, вы должны использовать этот небольшой трюк с привязкой:
  1. Настройте x:Name для родительской страницы содержимого
  2. В элементе, который вы хотите скрыть, добавьте это: {Источник привязки={x:Ссылочное имя страницы}, Путь=BindingContext.NameOfProperty}

Подробнее об этом здесь

Комментарии:

1. Спасибо за замечания. Это поможет мне изменить свойство видимости. Но как мне привязать модель к представлению? Я обновил свой вопрос с моим форматом данных.

2. @JivanBhandari Если вы уже установили контекст привязки страницы, переместите код в переопределении OnAppearing в конструктор страницы. Теперь внутри напишите BindingContext = TransactionHistory, убедитесь, что это делается только в том случае, если TransactionHistory != null. learn.microsoft.com/en-us/xamarin/xamarin-forms/xaml /… для получения дополнительной информации о BindingContext, хотя не похоже, что вы следуете принципам MvvM

3. Да, я не использую принцип MVVM. Я придерживаюсь MVC, но оказывается, что это довольно запутанно.