#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} (похоже, вы уже установили привязку страницы)
- Чтобы получить доступ к привязке страницы, вы должны использовать этот небольшой трюк с привязкой:
- Настройте x:Name для родительской страницы содержимого
- В элементе, который вы хотите скрыть, добавьте это: {Источник привязки={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, но оказывается, что это довольно запутанно.