更新2:我已经确定这是由我使用的Xamarin Forms扩展卡视图(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” . 问题是这个单个标签在两个不同的位置绘制两次(见下面的截图) . 如何重新绘制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";
}