更新 2:我确定这是由我正在使用的 Xamarin Forms Extended Card View (XfxCardView) 包引起的。更改框架的卡片视图可以解决问题(图 1)。
<Frame
Grid.Column="0"
Grid.Row="0"
Padding="0"
CornerRadius="10"
HasShadow="true">
<Label
Margin="12"
VerticalTextAlignment="Center"
Text="{Binding Total}"
FontSize="32"
HorizontalTextAlignment="Center"
HorizontalOptions="Center"
VerticalOptions="Center"
TextColor="Gray" />
</Frame>
更新 1:我发现添加背景颜色会消除其中一个重复项(图 2),但它的位置错误。一旦属性更新为新值,错误的标签就会消失并显示正确的标签。更改标签上的“HorizontalOptions”和“VerticalOptions”只会移动不正确的标签(图 3)。
我有一个 XAML ContentPage,里面有多个子 ContentView。都有自己的视图模型。我构建了视图模型,以便在调用主机 ContentPage 的 OnAppearing() 方法时,它会在所有视图模型上调用 Start() 以将默认值设置为属性。这些属性之一是获取默认值“$0.00”的标签。问题是这个单一标签在 2 个不同的位置绘制了两次(见下面的截图)。如何使 ContentView 重绘以便只显示正确的标签?
我已经完成了测试,并且知道只有一个标签(我错过的某处没有重复),并且我知道这是导致问题的可绑定属性的设置。将值硬编码到 xaml 中可以防止这种情况(当然我不能将属性绑定到它)。
父 ContentPage 的一部分:
<Grid
Grid.Row="2"
Grid.Column="0"
RowSpacing="0"
ColumnSpacing="0"
HorizontalOptions="Fill"
VerticalOptions="Fill"
x:Name="SubviewLayout">
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="100*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition
Height="100*" />
</Grid.RowDefinitions>
<views:SaleItemListView
x:Name="SalesItemListView" />
<views:KeypadView
x:Name="KeypadView" />
</Grid>
“键盘视图”的适用部分
<Grid
ColumnSpacing="0"
HorizontalOptions="Center"
VerticalOptions="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="100*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition
Height="*" />
<RowDefinition
Height="Auto" />
</Grid.RowDefinitions>
<xfx:XfxCardView
Grid.Column="0"
Grid.Row="0"
CornerRadius="10"
Elevation="15">
<Label
Margin="12"
VerticalTextAlignment="Center"
Text="{Binding Total}"
FontSize="32"
HorizontalTextAlignment="Center"
BackgroundColor="Transparent"
TextColor="Gray" />
</xfx:XfxCardView>
Parent的ViewModel的适用部分
public SalesViewModel()
{
KeypadViewModel = new KeypadViewModel();
}
public override async Task Start()
{
await ListViewModel.Start();
await KeypadViewModel.Start();
}
KeypadViewModel 的适用部分
public string Total { get; set; }
public override async Task Start()
{
Total = "$0.00";
}