한 가지 방법은 사용자 컨트롤을 만드는 것입니다.
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}
};
여기 페이지
<userControls:TotalsGridControl Totals="{Binding Totals}"/>
에서 XAML 그리고 당신은에서 그것을 할 수
출력되는보기 모델의 데이터입니다 코드가 아니라 VM이 있어야하며 View의 코드 숨김이 아닌 이유는 무엇입니까? VM에서이 작업을 수행하면 MVVM이 심각하게 손상됩니다. View의 코드가 VM의 행 수에 따라 업데이트되지 않는 이유는 무엇입니까? – Jason
흠, 이제 나는 두 가지 질문에 나쁘게 말하고 잘못된 생각을하고있었습니다. 내가 뭘하고 싶은 건 ViewModel에서 행을 추가하는 것이 아니라 ViewModel에 뷰에 대해 알리지 않고 행을 추가 할 수 있습니다. 그러나 이제는이 방법으로 보았습니다. 해결책은 분명합니다. 정말 고마워요! – Katie
GST 및 PST에 대해 자동 크기 조정 행을 만들고 숨길 필요는 없습니까? 추신. FreshMvvm을 사용하여 당신을 만나서 반가워요! –