我可以在Xamarin Forms中为Xaml设置重复的模板吗?

时间:2018-07-15 09:38:34

标签: xamarin xamarin.forms

我在应用程序中多次使用相同的XAML,但有两个小的区别,即我传入的Text和Selected的值:

<ViewCell Tapped="selectValue" >
   <Grid VerticalOptions="CenterAndExpand" Padding="20,0" >
      <local:StyledLabel Text="{Binding [1].Name}" HorizontalOptions="StartAndExpand" />
      <local:StyledLabel IsVisible="{Binding [1].IsSelected}" TextColor="Gray" HorizontalOptions="End" Text="✓" />
   </Grid>
</ViewCell>

Xamarin表单是否具有任何模板功能,例如,我可以将其简化为:

<local:SwitchViewCell Text="{Binding [1].Name}" Selected="{Binding [1].IsSelected}" />

这是我到目前为止所拥有的:

<?xml version="1.0" encoding="utf-8" ?>
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
          xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
          mlns:local="clr-namespace:Japanese;assembly=Japanese"
          x:Class="Japanese.SwitchViewCell""
          Tapped="selectValue" >
   <Grid VerticalOptions="CenterAndExpand" Padding="20,0" >
      <local:StyledLabel Text="{Binding Text, Source={x:Reference this}}" HorizontalOptions="StartAndExpand" />
      <local:StyledLabel IsVisible="{Binding IsVisible, Source={x:Reference this}}" TextColor="Gray" HorizontalOptions="End" Text="✓" />
   </Grid>
</ViewCell>

现在有了该代码:

namespace Japanese.Templates
{
    public partial class SwitchViewCell : ViewCell
    {
        public SwitchViewCell()
        {
            InitializeComponent();
        }

        public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(SwitchViewCell));
        public static readonly BindableProperty IsVisibleProperty = BindableProperty.Create(nameof(IsVisible), typeof(bool), typeof(SwitchViewCell));

        public string Text
        {
            get
            {
                return (string)GetValue(TextProperty);
            }
            set
            {
                SetValue(TextProperty, value);
            }
        }

        public bool IsVisible
        {
            get
            {
                return (bool)GetValue(IsVisibleProperty);
            }
            set
            {
                SetValue(IsVisibleProperty, value);
            }
        }


    }
}

我不确定这是否是100%可行的方法,但是当我尝试实现这一点时,我会收到消息:

 EventHandler "selectValue" not found in type "Japanese.Templates.SwitchViewCell" (Japanese)

2 个答案:

答案 0 :(得分:1)

ListView单元格:

对于ListView单元,可以定义ListView项的ViewCell布局。 例如PersonCell.xaml

<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
          x:Class="DataTemplates.PersonCell">
     <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.3*" />
            <ColumnDefinition Width="0.3*" />
            <ColumnDefinition Width="0.4*" />
        </Grid.ColumnDefinitions>
        <Label Text="{Binding FirstName}" />
        <Label Grid.Column="1" Text="{Binding LastName}" />
        <Label Grid.Column="2" Text="{Binding Email}" />
    </Grid>
</ViewCell>

然后您可以将其用于ListView的DataTemplate中,如下所示:

<ListView ItemSource="{Binding PersonList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <local:PersonCell />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这样ListView重新使用每个项目的单元格设计。

可重复使用的视图:

您还可以创建可重复使用的视图,该视图可以简单地包含在页面中。 例如MyCustomView.xaml:

<Grid xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Xam.Control.MyCustomView"> 
    <StackLayout>
        <Label Text="Hello"/>
        <Label Text="How Are You?"/>
    </StackLayout>
</Grid>

页面:

<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
xmlns:customView="clr-namespace:Xam.Control;assembly=Xam"
x:Class="Xam.View.HomePage">

在这里,请注意,您必须包括自定义视图所在的名称空间和程序集。

然后在此页面中,只需将其添加为:

<customView:MyCustomView />

答案 1 :(得分:0)

当然,只需将其放在单独的XAML文件中并定义所需的可绑定属性,然后将值映射到自定义控件中的控件。实际上,并不是绝对需要后者,但是更好地使其完全可重用。

如果您只想在项目中重用它,并且始终将数据绑定到相同的字段,则可以原样保留它,因为BindingContext将被继承。

为使您入门,您可能想看一下我的博客文章:https://blog.verslu.is/xamarin/xamarin-forms-xamarin/reusable-custom-usercontrols-with-bindableproperty/