我有一个Xamarin表单应用程序,其中我在一个ListView中展示了来自不同传感器的结果。每个传感器都填充一个“ DataTemplate” ViewCell,在其中显示名称,位置和其他信息,并在中央网格中显示值。
关键是这些值的可视化应该与每个传感器不同(想象一下,我想要一个用于风的移动箭头,一个用于收集水的蓝色框,用于温度的数字等等)>
是否可以从IValueConverter返回自定义UIElement或Grid或其他东西,并且能够执行此任务? 如果没有,您会推荐什么?
PS:我想我想做的是通过ContentPresenter完成的。但是..我找不到有关如何实现的适当细节。
答案 0 :(得分:2)
DataTemplateSelector
之类的声音应该可以解决您的问题:
DataTemplateSelector可用于在运行时选择DataTemplate 基于数据绑定属性的值。这使得多个 DataTemplates将应用于相同类型的对象,以自定义 特定对象的外观。本文演示了如何 创建并使用一个DataTemplateSelector。
官方文档:Creating a Xamarin.Forms DataTemplateSelector
创建DataTemplateSelector:
public class PersonDataTemplateSelector : DataTemplateSelector
{
public DataTemplate ValidTemplate { get; set; }
public DataTemplate InvalidTemplate { get; set; }
protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
{
return ((Person)item).DateOfBirth.Year >= 1980 ? ValidTemplate : InvalidTemplate;
}
}
在XAML中使用DataTemplateSelector:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Selector;assembly=Selector" x:Class="Selector.HomePage">
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="validPersonTemplate">
<ViewCell>
...
</ViewCell>
</DataTemplate>
<DataTemplate x:Key="invalidPersonTemplate">
<ViewCell>
...
</ViewCell>
</DataTemplate>
<local:PersonDataTemplateSelector x:Key="personDataTemplateSelector"
ValidTemplate="{StaticResource validPersonTemplate}"
InvalidTemplate="{StaticResource invalidPersonTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
...
</ContentPage>
<ListView x:Name="listView" ItemTemplate="{StaticResource personDataTemplateSelector}" />