。
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}"/>
そして、あなたからそれを行うことができ、出力
ですなぜ、それはVMでなければならず、Viewのコードビハインドではないのでしょうか? VMでそれを行うと、MVVMがひどく壊れてしまいます。 Viewのコードは、VMの行数に基づいて更新できないのはなぜですか? – Jason
ええ、私は今質問を間違って考えていました。私がしたいのは、ViewModelから行を追加するのではなく、ViewModelにViewを知らせずに行を追加できることです。しかし、今私はそれをこのように見て、解決策は明らかです。とてもありがとう! – Katie
GSTとPSTの自動サイズの行を作成して非表示にすることはできませんか? p.s. FreshMvvmを使ってあなたを見てうれしい! –