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}" />
我有一个 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}" />