Xamarin.forms 如何在xamarin表单的列表视图中动态设置项目的元素可见性

Xamarin.forms 如何在xamarin表单的列表视图中动态设置项目的元素可见性,xamarin.forms,Xamarin.forms,我正在尝试用Xamarin表单创建一个页面,它模仿HTML中的表格样式。我希望标题和数据能够根据条件删除或显示。我的问题是我无法找到一种方法来访问列表视图的ViewCell中的某些属性 我的XAML代码是这样的 <Grid x:DataType="models:TransactionHistory" > <Grid.ColumnDefinitions> <ColumnDefinition

我正在尝试用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; }
    }
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;
        }
我的问题是如何将事务历史模型绑定到视图,以便使用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如下所示

 <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; }
    }
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;
        }
public TransactionHistory GetTransactions()
{
TransactionHistory transaction=新建TransactionHistory
{
ShowDescriptionColumn=true,
ShowQuantityColumn=true,
ShowDateRaisedColumn=true,
ShowExtensionColumn=true,
ShowTransactionNumberColumn=true,
TransactionHistories=新列表
{
新历史
{
DateRaised=DateTime.Now.ToSortDateString(),
Description=“史密斯芯片”,
延伸段=2.25米,
FormattedExtension=2.25.ToString(“C”),
数量=2,
TransactionNumber=“1234”
},
新历史
{
DateRaised=DateTime.Now.ToSortDateString(),
Description=“史密斯芯片”,
延伸段=2.25米,
FormattedExtension=2.25.ToString(“C”),
数量=2,
TransactionNumber=“1234”
},
新历史
{
DateRaised=DateTime.Now.ToSortDateString(),
Description=“史密斯芯片”,
延伸段=2.25米,
FormattedExtension=2.25.ToString(“C”),
数量=2,
TransactionNumber=“1234”
}
}
};
退货交易;
}

如果我理解你的问题

  • 在XAML中,设置ListView项资源={Binding TransactionHistories}(看起来您已经设置了页面的绑定)
  • 为了访问页面绑定,您必须使用这个小的 绑定技巧:
  • 为父ContentPage设置一个x:Name
  • 在要隐藏的元素中,添加以下内容:{Binding Source={x:Reference NameOfPage},Path=BindingContext.NameOfProperty}

  • 如果我能理解你的问题,我会更多地了解它

    • 在XAML中,设置ListView项资源={Binding TransactionHistories}(看起来您已经设置了页面的绑定)
    • 为了访问页面绑定,您必须使用这个小的 绑定技巧:
  • 为父ContentPage设置一个x:Name
  • 在要隐藏的元素中,添加以下内容:{Binding Source={x:Reference NameOfPage},Path=BindingContext.NameOfProperty}

  • 更多关于它的信息

    谢谢你的观点。这将帮助我更改可见性属性。但是如何将模型绑定到视图?我已经用我的数据格式更新了我的问题。@JivanBhandari如果认为您已经设置了页面绑定上下文,请将OnAppearing覆盖中的代码移到页面的构造函数中。现在,在其中写入BindingContext=transactionHistory,确保仅在transactionHistory!=无效的有关BIndingContext的更多信息,尽管看起来您没有遵循MvvM原则是的,我没有使用MvvM原则。我坚持MVC,但结果是它很混乱。谢谢你的意见。这将帮助我更改可见性属性。但是如何将模型绑定到视图?我已经用我的数据格式更新了我的问题。@JivanBhandari如果认为您已经设置了页面绑定上下文,请将OnAppearing覆盖中的代码移到页面的构造函数中。现在,在其中写入BindingContext=transactionHistory,确保仅在transactionHistory!=无效的有关BIndingContext的更多信息,尽管看起来您没有遵循MvvM原则是的,我没有使用MvvM原则。我坚持使用MVC,但事实证明它很混乱。