Просмотр привязки ячеек вызывает cra sh при удалении элемента на android - PullRequest
0 голосов
/ 02 апреля 2020

Я сталкиваюсь с проблемой, когда, если я даю свой фрейм, который находится внутри шаблона элемента ListView, при удалении объекта я получаю исключение FrameRenderer, в частности Unable to activate instance of type Xamarin.Forms.Platform.Android.FrameRenderer. Однако на iOS это не проблема. Если я установлю значение stati c для радиуса угла, ошибка исчезнет.

Причина, по которой мне нужно, чтобы модель вида управляла радиусом рамки, заключается в том, что мы пытаемся создать круги, и мы заметили, что для достижения круга android должен иметь угол радиус в два раза больше его ширины и радиуса. ТАК если W = R = 20, то угловой радиус равен 40. Для iOS это обратное значение, угловой радиус равен половине.

XAML, где он связан:

<ListView SelectedItem="{Binding SelectedUser, Mode=TwoWay}" ItemsSource="{Binding Users}" HasUnevenRows="True" SeparatorVisibility="None">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <customcontrols:NoHighlightCell>
                                        <StackLayout effects:RoundCornersEffect.CornerRadius="8" Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="Start" Spacing="0" Margin="0, 5, 0, 5">
                                                <BoxView HeightRequest="1" WidthRequest="5" VerticalOptions="FillAndExpand" HorizontalOptions="Start" BackgroundColor="{Binding SelectedColor}"></BoxView>
                                                <StackLayout Opacity="{Binding Opacity}" Padding="5, 5, 0, 5" VerticalOptions="StartAndExpand" HorizontalOptions="FillAndExpand" Orientation="Horizontal" BackgroundColor="{Binding CellBackgroundColor}">
                                                    <Frame Padding="0" WidthRequest="40" HeightRequest="40" CornerRadius="{Binding CornerRadiusForPhone}"  BackgroundColor="{Binding InitialCircleColor}" VerticalOptions="Start" HorizontalOptions="Start" HasShadow="False">
                                                        <Label Padding="0" Text="{Binding UserInitials}" TextColor="{Binding LetterColoring}" FontAttributes="Bold" FontSize="14" HorizontalOptions="Center" HorizontalTextAlignment="Start" VerticalTextAlignment="Center"></Label>
                                                    </Frame>
                                                    <StackLayout Spacing="0" Orientation="Horizontal" Padding="20, 0, 0, 0" HorizontalOptions="FillAndExpand">
                                                        <StackLayout Orientation="Vertical" HorizontalOptions="Fill" VerticalOptions="Fill">
                                                            <Label FontAttributes="Bold" Text="{Binding FullName}" VerticalOptions="EndAndExpand"/>
                                                            <Label Text="{Binding Location}" VerticalOptions="EndAndExpand"></Label>
                                                        </StackLayout>
                                                        <customcontrols:UnderlineLabel TextDecorations="Underline" Padding="0, 0, 14, 0" Text="Remove" TextColor="#BB3734" FontSize="13" HorizontalOptions="EndAndExpand" HorizontalTextAlignment="Start" VerticalTextAlignment="Center" IsVisible="{Binding ManagingUsers}">
                                                            <customcontrols:UnderlineLabel.GestureRecognizers>
                                                                <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding Path=BindingContext.RemoveUserCommand, Source={x:Reference root}}" CommandParameter="{Binding .}"></TapGestureRecognizer>
                                                            </customcontrols:UnderlineLabel.GestureRecognizers>
                                                        </customcontrols:UnderlineLabel>
                                                    </StackLayout>
                                                </StackLayout>
                                            </StackLayout>
                                    </customcontrols:NoHighlightCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>

Код CornerRadiusForPhone в модели представления:

 public float CornerRadiusForPhone {
            get {
                if(Device.RuntimePlatform == Device.Android)
                {
                    return 80f;
                } else
                {
                    return 20f;
                }
            } 
        }

Часть кода, вызывающая кр sh находится в модели представления, связанной с XAML, которая просто удаляет выбранный элемент из коллекции Users ObservableCollection, которая является ItemSource Списка.

private void RemoveUser(object obj)
{
    try
    {
        var toRemove = (RegisteredUsersViewModel) obj;
        tokenService.Logout(toRemove.UserId);
        Users.Remove(toRemove);
    } catch (Exception e)
    {
        Console.Write(e);
    }

}

Обычно я предпочел бы использовать OnPlatform внутри xaml, но если я не ошибаюсь, так как CornerRadius - это float и нет аргумента типа float, я не могу использовать этот трюк.

1 Ответ

0 голосов
/ 02 апреля 2020

Хотя я все еще не уверен, почему я не могу использовать этот тип привязки, я понял, что CornerRadius, очевидно, имеет тип Single при выполнении OnPlatform. Это странно, как будто вы go в своем определении явно указали тип с плавающей точкой. Независимо от этого, вот решение

<Frame.CornerRadius>
     <OnPlatform x:TypeArguments="x:Single" iOS="20" Android="80"/>
</Frame.CornerRadius>

Это делает то же самое, что и предполагалось при первоначальном связывании, но без отрицательного эффекта создания cra sh из-за проблемы рендеринга кадра

...