Как принудительно перерисовать метку Xamarin Forms или представление для предотвращения дублирования метки - PullRequest
0 голосов
/ 03 октября 2018

Обновление 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> 

enter image description here

ОБНОВЛЕНИЕ 1: я обнаружил, что добавление цвета фона устраняет один из дубликатов (рис. 2), но это одинв неправильном положении.Как только свойство обновляется до нового значения, неправильная метка исчезает и отображается правильная.И изменение «HorizontalOptions» и «VerticalOptions» на метке просто перемещает неправильную метку вокруг (рис. 3).

enter image description here enter image description here

У меня есть XAML ContentPage с несколькими дочерними ContentViews внутри.У всех есть свои представления о моделях.У меня есть модели представлений, построенные таким образом, что при вызове метода OnAppearing () хостов ContentPage он вызывает Start () для всех моделей представлений, чтобы установить значения по умолчанию для свойств.Одним из этих свойств является метка, которая получает значение по умолчанию «$ 0.00».Проблема в том, что эта метка отображается дважды в двух разных позициях (см. Скриншот ниже)Как сделать так, чтобы ContentView перерисовывал, чтобы отображалась только правильная метка?

Я провел тестирование и знаю, что существует только одна метка (где-то пропущен ни один дубликат), и я знаю, что именно настройка свойства bindable вызывает проблему.Жесткое кодирование значения в xaml предотвращает это (тогда, конечно, я не могу привязать к нему свойство).

Часть Parent 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>

Применимая часть родительской 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";
    }

enter image description here

...