Xamarin中的超级Curstom值转换器

时间:2018-10-09 08:12:24

标签: xamarin xamarin.forms ivalueconverter

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

关键是这些值的可视化应该与每个传感器不同(想象一下,我想要一个用于风的移动箭头,一个用于收集水的蓝色框,用于温度的数字等等)

是否可以从IValueConverter返回自定义UIElement或Grid或其他东西,并且能够执行此任务? 如果没有,您会推荐什么?

PS:我想我想做的是通过ContentPresenter完成的。但是..我找不到有关如何实现的适当细节。

1 个答案:

答案 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}" />