c# - 在android上删除元素时查看单元格绑定导致崩溃
问题描述
我面临一个问题,如果我在 ListView 的项目模板内提供我的框架,当我删除一个对象时,我会得到一个 FrameRenderer 异常,特别是Unable to activate instance of type Xamarin.Forms.Platform.Android.FrameRenderer
. 但是,在 iOS 上,这不是问题。如果我为拐角半径设置一个静态值,错误就会消失。
我需要让视图模型控制框架半径的原因是我们正在尝试创建圆,并且我们注意到为了实现圆,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;
}
}
}
导致崩溃的部分代码位于与 XAML 关联的视图模型中,它只是从Users
作为 List 的 ItemSource 的 ObservableCollection 中删除选定的项目。
private void RemoveUser(object obj)
{
try
{
var toRemove = (RegisteredUsersViewModel) obj;
tokenService.Logout(toRemove.UserId);
Users.Remove(toRemove);
} catch (Exception e)
{
Console.Write(e);
}
}
通常我更喜欢在 xaml 中使用 OnPlatform,但除非我弄错了,因为 CornerRadius 是一个浮点数并且没有浮点类型参数,所以我不能使用那个技巧。
解决方案
虽然我仍然不确定为什么我不能使用这种类型的绑定,但我确实意识到 CornerRadius 在执行 OnPlatform 时显然属于 Single 类型。这很奇怪,好像你去定义它显然是一个浮点类型。无论如何,这是解决方案
<Frame.CornerRadius>
<OnPlatform x:TypeArguments="x:Single" iOS="20" Android="80"/>
</Frame.CornerRadius>
这与我的初始绑定应该做的事情相同,但没有由于帧渲染问题而导致崩溃的负面影响
推荐阅读
- macos - 如何解决“macOS 包创作错误”
- c++ - 使用具有自己功能的 << 运算符来“覆盖” cout
- asp.net-mvc - Kendo UI 分层网格显示没有子元素的标题
- r - 如何使for循环创建新列,其中包含有关每个值是低于还是高于列平均值的信息?
- javascript - 如何使用排序选项?
- javascript - 如何在循环中调用异步函数?
- wordpress - 如何在没有 API 的情况下在 Wordpress 中导入亚马逊联盟产品?
- c# - 将查询字符串参数从对象附加到 URL 的最佳方法
- python - 合并数据框中的相同列
- ssl - 让我们与 Jitsi Meet 一起为站点加密证书