Xamarin.Forms:是否可以在不调用 ViewModel 的情况下将行动态添加到网格?

凯蒂

在我向用户显示收据的页面上,我有一个部分列出了小计、任何税款和总计。由于适用的税费因地区和销售的产品而异,因此本节中的行数会有所不同。例如,这里有 3 个单独的订单,一个有 GST 和 PST,一个只有 GST,一个没有:

消费税+太平洋标准时间

仅消费税

没有税

我已经通过在 XAML 中仅将 SubTotal 放在网格中,并将其余部分添加到我从 ViewModel 调用的方法中的代码隐藏中来实现的。但是,我真的很想避免这样做,所以我想知道是否有一种方法可以完成此操作,而无需让 ViewModel 了解视图。

AListView不适合这里的原因有很多:

  • 这些控件在ScrollViewaListView内部,并且在 a内部ScrollView会导致各种奇怪的问题。
  • 我想保持列的宽度与其最宽的元素一样窄。这可以通过 a 实现Grid,但ListView无论如何a都会占据其父级的整个宽度。
  • 我不需要也不希望我的行是可选的

那么有没有一种方法可以在 ViewModel 不知道 View并且不使用 a 的情况下做到这一点ListView

史蒂夫·查德伯恩

封装您需要的功能以使视图和视图模型不耦合的一种方法是创建用户控件。

我创建了一个名为 TotalsGridControl 的新用户控件。这是 XAML

<?xml version="1.0" encoding="UTF-8"?>
<Grid xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ScratchPad.UserControls.TotalsGridControl"
             x:Name="TotalsGrid">

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

</Grid>

这是背后的代码。

public partial class TotalsGridControl : Grid
{
    public TotalsGridControl()
    {
        InitializeComponent();
    }

    public static readonly BindableProperty TotalsProperty =
        BindableProperty.Create(nameof(Totals), typeof(List<TotalItem>), typeof(TotalsGridControl), null,
            BindingMode.OneWay, null, OnTotalsChanged);

    private static void OnTotalsChanged(BindableObject bindable, object oldvalue, object newvalue)
    {
        var control = (TotalsGridControl)bindable;
        if (control != null)
        {
            if (newvalue is List<TotalItem> totals)
            {
                var rowNumber = -1;
                double grandTotal = 0;

                foreach (var totalItem in totals)
                {
                    grandTotal += totalItem.Value;

                    var descLabel = new Label {Text = totalItem.Description};
                    var valueLabel = new Label { Text = totalItem.Value.ToString("c") };

                    rowNumber++;
                    control.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto});
                    control.Children.Add(descLabel, 0, rowNumber);
                    control.Children.Add(valueLabel, 1, rowNumber);
                }

                var grandTotalDescLabel = new Label { Text = "Total" };
                var grandTotalValueLabel = new Label { Text = grandTotal.ToString("c") };

                rowNumber++;
                control.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
                control.Children.Add(grandTotalDescLabel, 0, rowNumber);
                control.Children.Add(grandTotalValueLabel, 1, rowNumber);
            }
        }
    }

    public List<TotalItem> Totals
    {
        get => (List<TotalItem>)GetValue(TotalsProperty);
        set => SetValue(TotalsProperty, value);
    }
}

我使用了一个可绑定属性来允许将 TotalItem 列表绑定到用户控件。

这是视图模型中的数据

public List<TotalItem> Totals { get; set; }

Totals = new List<TotalItem>
{
    new TotalItem {Description = "SubTotal", Value = 99.91},
    new TotalItem {Description = "GST", Value = 5.0},
    new TotalItem {Description = "PST", Value = 4.9}
};

这是页面中的 XAML

<userControls:TotalsGridControl Totals="{Binding Totals}"/>

和输出

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

动态将BoxViews添加到网格[Xamarin.Forms]

来自ViewModel的Xamarin Forms调用命令

将XAML元素公开到ViewModel以运行方法Xamarin Forms

将 SFDataGrid 的列绑定到 Xamarin Forms 中的 ViewModel 属性

Xamarin.Forms-将值从View传递到ViewModel

Xamarin.Forms从mvvm ViewModel设置焦点

Xamarin.Forms:将项目从代码添加到网格的特定行

是否可以在不调用onSeeked的情况下动态设置视频的currentTime?

将流 ImageSource 绑定到 ViewModel 中 Xamarin Forms 中 FlowListView 中的 Image

Xamarin Android-如何将事件从MainActivity传递给Forms页面上的ViewModel?

将视图绑定到viewmodel并显示为Xamarin.Forms中的对话框页面?

如何将ListView.ItemTapped事件绑定到Xamarin Forms中的ViewModel命令?

Xamarin.Forms (PRISM) - 将复选框绑定到 viewmodel 中的命令,在 listview itemsource 之外

如何在 MVVM 之后将数据从 ViewModel 传递到 Xamarin.Forms 中的 View 代码?

是否可以在不重写的情况下将数据添加到文件中?

如何在不调用函数参数的情况下将其添加到函数参数

标记中的Xamarin.Forms ViewModel不会加载dll

xamarin.forms listview 由 BindingContext 和 viewmodel 填充

在Xamarin.Forms上的XAML中将BindingContext设置为ViewModel

如何从ViewModel中删除方法的执行-Xamarin.Forms-MVVM

Xamarin Forms Switch Toggled事件未与ViewModel绑定

如何在ViewModel ins xamarin.forms中使用参数

将 Xamarin Forms TabView 添加到 ContentPage 的中间

如何将Json文件添加到Xamarin Forms?

Xamarin.Forms 将子页面添加到 TabbedPage

如何使用mvvmLight在Xamarin Forms中将数据从ContentPage ViewModel传递到ContentView Viewmodel?

Xamarin MvvmCross ViewModel验证

Python:是否可以在不调用函数的情况下解压缩参数?

是否可以在不调用数据库的情况下创建空IQueryable的实例?