xamarin - 如何通过传入类型参数来自定义 Xamarin 模板?

标签 xamarin xamarin.forms

这是我迄今为止想出的方法。然而,这似乎不是一个干净的解决方案。

有人对我如何提出更好的解决方案有任何建议吗?

<?xml version="1.0" encoding="utf-8"?>
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:Japanese;assembly=Japanese" 
             x:Class="Japanese.Templates.HeaderTemplate" 
             x:Name="this" HorizontalOptions="FillAndExpand" Orientation="Vertical" Spacing="0" Margin="0">
    <StackLayout IsVisible="{Binding HeaderType, Converter={StaticResource HeaderType1BoolConverter}, Source={x:Reference this}  }" >
        <!-- code -->
    </StackLayout>
    <StackLayout IsVisible="{Binding HeaderType, Converter={StaticResource HeaderType2BoolConverter}, Source={x:Reference this}  }" >
        <!-- code -->
    </StackLayout>
</StackLayout>

在我的银行端CS:

using System;
using System.Collections.Generic;
using Xamarin.Forms;

namespace Japanese.Templates
{
    public partial class HeaderTemplate : StackLayout
    {
        public HeaderTemplate()
        {
            InitializeComponent();
        }

   public static readonly BindableProperty HeaderTypeProperty =
        BindableProperty.Create(
            nameof(HeaderType),
            typeof(string),
            typeof(DataViewCellTemplate),
            default(string));

    public string HeaderType
    {
        get { return (string)GetValue(HeaderTypeProperty); }
        set { SetValue(HeaderTypeProperty, value); }
    }

    }
}

转换器代码:

public class HeaderType1BoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return object.Equals(value, "1");
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

public class HeaderType2BoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return object.Equals(value, "2");
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在调用代码中:

<template:HeaderTemplate Header="Application" HeaderType="1" />

最佳答案

使用triggers是一个选项。

例如:您可以添加属性触发器来检查 HeaderType 上的值,并相应地更新自定义控件 HeaderView< 中的 Content (或布局)/

请注意,在这种情况下,我们是从 ContentView 扩展的,而不是 StackLayout 的,假设一次只有一个布局/控件可见。>

XAML

<ContentView 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:SampleApp" 
    x:Class="SampleApp.HeaderView">

    <ContentView.Triggers>

        <!-- if header type is 1, use header1 layout -->
        <Trigger TargetType="local:HeaderView" Property="HeaderType" Value="1">
            <Setter Property="Content">
                <Setter.Value>
                    <Label Text="Header1" />
                </Setter.Value>
            </Setter>
        </Trigger>

        <!-- if header type is 2, use header2 layout -->
        <Trigger TargetType="local:HeaderView" Property="HeaderType" Value="2">
            <Setter Property="Content">
                <Setter.Value>
                    <StackLayout>
                        <Label Text="Header2" />
                        <BoxView HeightRequest="1" BackgroundColor="Gray" />
                    </StackLayout>
                </Setter.Value>
            </Setter>
        </Trigger>

        <!-- you can add more layouts here if you need -->

    </ContentView.Triggers>

    <!-- add default content that can be displayed in case of no match -->
    <StackLayout>
        <Label Text="DefaultHeader" />
        <BoxView HeightRequest="1" BackgroundColor="Gray" />
    </StackLayout>    

</ContentView>

代码隐藏

public partial class HeaderView : ContentView
{
    public HeaderView()
    {
        InitializeComponent();

    }

    public static readonly BindableProperty HeaderTypeProperty =
        BindableProperty.Create(
            nameof(HeaderType), typeof(string), typeof(HeaderView),
            defaultValue: default(string));

    public string HeaderType
    {
        get { return (string)GetValue(HeaderTypeProperty); }
        set { SetValue(HeaderTypeProperty, value); }
    }
}

使用

<local:HeaderView HeaderType="1" />

关于xamarin - 如何通过传入类型参数来自定义 Xamarin 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51465385/

相关文章:

xamarin - 在 xamarin 的 Pin 标签中显示全文

c# - 应用渲染器时选择器布局发生变化

c# - Xamarin.Forms-为什么 NavigationPage 的 CustomRenderer Android 抛出 InvalidCastException?

xamarin - 如何将 ListView.ItemTapped 事件绑定(bind)到 Xamarin Forms 中的 ViewModel 命令?

android - 项目看不到命名空间 "ZBar"Xamarin.Android

c# - 按后退按钮时显示警报

sqlite - Xamarin SQLIteConnection : method "Get" throw exception if key doesn't exist

c# - Xamarin Forms 主详细信息页面主页隐藏导航栏

visual-studio - 如何将标签文本添加到圆形框 View 中

ios - Xamarin.iOS 应用程序项目应用程序无法识别 GoogleService-Info.plist