Xamarin 中的超级 Curstom 值转换器

super Curstom value converters in Xamarin

我有一个 Xamarin 表单应用程序,我在一个 ListView 中展示来自不同传感器的结果。每个传感器填充一个 'DataTemplate' ViewCell,我在其中显示名称、位置和其他信息,并在中央网格中显示值。

重点是这些值的可视化应该与每个传感器不同(假设我想要一个移动的箭头代表风,一个不断增长的蓝色盒子代表收集的水,一个数字代表温度,等等)

是否可以 return 自定义 UIElement、Grid 或来自 IValueConverter 的东西并能够完成此任务? 如果没有,你会推荐什么?

PS:我认为,我想做的事情是通过 ContentPresenter 完成的。但是..我找不到关于如何实现它的适当细节。

听起来 DataTemplateSelector 应该可以解决您的问题:

A DataTemplateSelector can be used to choose a DataTemplate at runtime based on the value of a data-bound property. This enables multiple DataTemplates to be applied to the same type of object, to customize the appearance of particular objects. This article demonstrates how to create and consume a 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}" />