我在Xamarin中创建的自定义视图的数据绑定问题。我是Xamarin的新手,但有几年编程经验。我正在从数字访问管理API中提取数据,并将其反序列化为对象“ Item”。
public partial class Item
{
[JsonProperty("id")]
public Guid Id { get; set; }
[JsonProperty("external_id")]
public string ExternalId { get; set; }
[JsonProperty("filename")]
public string Filename { get; set; }
[JsonProperty("last_update_date")]
public DateTimeOffset LastUpdateDate { get; set; }
[JsonProperty("thumbnails")]
public Dictionary<string, Thumbnail> Thumbnails { get; set; }
[JsonProperty("_links")]
public Links Links { get; set; }
}
为简单起见,我省略了一些我不使用的不必要字段。
在该Item类的属性内,是一个字典<string, Thumbnail> Thumbnails
“缩略图”类如下所示:
public partial class Thumbnail
{
[JsonProperty("url")]
public Uri Url { get; set; }
[JsonProperty("valid_until")]
public DateTimeOffset ValidUntil { get; set; }
}
现在这是我的问题:在我设置的自定义视图中(为了在列表视图中显示有关该项目的某些信息,我继承自ViewCell),我想将数据绑定到Thumbnails [ “键”]。每个项目的网址值。现在,我只是尝试显示该URL以测试其是否正常运行,最终我将实际加载照片。
这是我创建的自定义视图:
public class AssetCell : ViewCell
{
public AssetCell()
{
var urlLabel = new Label
{
FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
FontAttributes = FontAttributes.Bold
};
urlLabel.SetBinding(Label.TextProperty, new Binding("Thumbnails[125px].Url"));
//var titleLabel = new Label
//{
// FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
// FontAttributes = FontAttributes.Bold
//};
//titleLabel.SetBinding(Label.TextProperty, new Binding("Filename"));
var updatedDateLabel = new Label
{
FontSize = Device.GetNamedSize(NamedSize.Micro, typeof(Label)),
VerticalTextAlignment = TextAlignment.End,
HorizontalOptions = LayoutOptions.Start
};
updatedDateLabel.SetBinding(Label.TextProperty, new Binding("LastUpdateDate", stringFormat: "{0:MMMM d, yyyy HH:mm}"));
View = new StackLayout
{
Children = { urlLabel, updatedDateLabel },
Orientation = StackOrientation.Vertical,
Padding = new Thickness(20, 0, 10, 0)
};
}
}
绑定到Item类的直接属性(例如注释掉的titleLabel和updatedDateLabel)可以按预期工作,但是我无法访问Thumbnails字典的属性(除此之外,Thumbnail对象的URI Url属性)是整个Item对象的一部分。
我尝试研究了一段时间,但没有结果。有没有办法设置绑定到嵌套对象的属性?这是正确的做法吗? 感谢您的帮助
答案 0 :(得分:0)
我只在XAML中使用数据绑定,但是对于嵌套对象的数据绑定在大多数情况下都应该起作用。
但是,尝试通过键访问字典可能会导致数据绑定问题。
此外,Xamarin似乎不喜欢在数据绑定时不能隐式转换的类型(例如:您的标签文本属性绑定应为字符串而不是Uri对象)
我建议编写一个转换器:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/converters
其中value是您的字典,您可以通过转换器参数输入密钥。
然后您将使用value [param]返回uri字符串,假设您正确地从对象投射了东西。
public class DictionaryToStringConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
// cast object to dictionary
Dictionary<string, Thumbnail> thumbnails = value as Dictionary<string, Thumbnail>;
// cast parameter to dictionary key
String key = parameter as string;
// retrieve value from dictionary
Uri uri = thumbnails[key].Url;
// returning string because label's text property is string
return uri.AbsoluteUri;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException("Not implemented");
}
}
我想知道是否还有更好的解决方案。