是否有任何理由在Xamarin Forms XAML页面中指定x:Name?

时间:2018-07-06 13:50:59

标签: xamarin xamarin.forms

我有如下所示的XAML代码;

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage 
    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.GettingStarted"
    x:Name="gettingStarted" 
    Title="Getting Started">
<ContentPage.Content>

我的C#

using System;
using System.Collections.Generic;

using Xamarin.Forms;

namespace Japanese
{
    public partial class GettingStarted : ContentPage
    {
        public GettingStarted()
        {

代码工作正常,但是我想知道在XAML中指定x:Name是否有任何优势或正常吗?

1 个答案:

答案 0 :(得分:2)

是的,有原因。但是,如果您还没有找到它们,您现在可能就不需要了。

最明显的原因是是否需要从XAML引用它。例如,您正在使用数据绑定并使用ListView。在ListView上,使用具有上下文操作的简单TextCell。 XAML可能看起来像这样(取自here,并做了一些调整):

<ListView ItemsSource="{Binding YourItems}">
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
         <ViewCell.ContextActions>
            <MenuItem Command="{Binding DeleteCommand}" CommandParameter="{Binding .}" Text="Delete" IsDestructive="True" />
         </ViewCell.ContextActions>
         <StackLayout Padding="15,0">
              <Label Text="{Binding title}" />
         </StackLayout>
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

现在,如果您以前使用过数据绑定,您将知道其中MenuItem的绑定已绑定到YourItems集合中对象的每个实例。

但是,在该集合中的实例上执行删除命令没有任何意义。您可能希望在视图模型中使用它。为此,您必须给页面起一个名字,并参考如下命令:<MenuItem Command="{Binding Source={x:Reference MyPage}, Path=BindingContext.DeleteCommand}" CommandParameter="{Binding .}" Text="Delete" IsDestructive="True" />,其中MyPage是您在x:Name属性中输入的值。

可能还有其他示例,但这是一个突出的例子。如果您不必以任何方式引用该页面,则为其命名就不会增加任何实际价值。