无法在Xaml中设置嵌套类的属性。

4

Xamarin报错:在xmlns clr-namespace:AmsterdamTheMapV3中未找到类型Foo。

问题在于我尝试定义Foo,但无论我怎么做都不起作用。我认为问题出在xmls:local命名空间内。也许我在代码中犯了一个愚蠢的错误。

这是一个适用于Windows、Android和Apple的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"
             x:Class="AmsterdamTheMapV3.CityGuide"
             xmlns:local="clr-namespace:AmsterdamTheMapV3">
  <Label Text="{Binding MainText}" VerticalOptions="Center" HorizontalOptions="Center" />
  <ScrollView Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
    <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"  Spacing="0">

      <!-- Button1 -->
      <Image
          x:Name="CityGuideButton1"
          Source="shopping_gray.png"
          Aspect="Fill"
          HorizontalOptions="FillAndExpand"
                VerticalOptions ="FillAndExpand"
          local:Foo.Tag="button1">
        <Image.GestureRecognizers>
          <TapGestureRecognizer
            Tapped="Categorie_Onclick"
            NumberOfTapsRequired="1"/>
        </Image.GestureRecognizers>
      </Image>
    </StackLayout>
  </ScrollView>
</ContentPage>

Cs文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace AmsterdamTheMapV3
{
    public partial class CityGuide : ContentPage
    {
        public CityGuide()
        {
            InitializeComponent();
        }

         public class Foo
        {
            public static readonly BindableProperty TagProperty = BindableProperty.Create("Tag", typeof(string), typeof(Foo), null);

            public static string GetTag(BindableObject bindable)
            {
                return (string)bindable.GetValue(TagProperty);
            }

            public static void SetTag(BindableObject bindable, string value)
            {
                bindable.SetValue(TagProperty, value);
            }
        }


        async void Categorie_Onclick(Object sender, EventArgs args)
        {
            Image cmd = sender as Image;
            string txt = Foo.GetTag(cmd);
            await Navigation.PushAsync(new CategoriePage(txt));
        }
    }
}

希望有人能够帮助我。
如需更多信息请告知。
提前感谢您!


请注意,您的Xaml可能不会显示您所期望的内容。您的ContentPage有两个子元素,一个Label和一个ScrollView,但是ContentPage只接受单个属性作为Content。在编写时,Xamarin.Forms Xaml解析器非常宽容,其中一个项目被忽略(通常是除最后一个之外的所有项目),但这可能会在未来发生变化并抛出异常。 - Stephane Delcroix
我在上传这个问题后进行了更改。标签本不应该出现。但还是感谢您的反馈。我会记住这一点的。 - N. Smeding
2个回答

10

你无法在Xaml中引用嵌套类。

这是一个普遍真理,你可以引用我的话或搜索一下,原因是Xaml解析器无法通过点号来区分依附属性(Bindable|Dependency)和嵌套类的访问。

在你的情况下,将Foo类从CityGuide中移动到该命名空间中即可解决问题。

你的xmlns声明xmlns:local="clr-namespace:AmsterdamTheMapV3"是正确的,不需要包含assembly=部分,因为你正在引用当前程序集。

更多类似答案的相关信息:https://dev59.com/dmUq5IYBdhLWcg3wYvZ6#14546917

有些人可能会问为什么不使用嵌套类的+符号(就像在Reflection中一样)。问题是,包含+符号的名称不是有效的XML元素名称(https://www.xml.com/pub/a/2001/07/25/namingparts.html)。


-1

您缺少程序集引用。

xmlns:local="clr-namespace:AmsterdamTheMapV3; assembly=AmsterdamTheMapV3">

来自Xamarin:

为了访问共享应用程序PCL中的本地类,例如AppConstants,XAML程序员经常使用前缀local。命名空间声明必须指示CLR(公共语言运行时)命名空间名称(也称为.NET命名空间名称,这是在C#命名空间定义或using指令中出现的名称)和包含代码的程序集。


@N.Smeding,请检查您的项目文件中的程序集名称,它们应该匹配。我假设它是AmsterdamTheMapV3,但是请打开您的ProjectFile.csproj文件,找到程序集名称,并将其替换为assembly=。 - Bruno Caceiro
我在哪里可以找到程序集名称?在属性中找不到它。 - N. Smeding
程序集名称相同根命名空间:AmsterdamTheMapV3 程序集名称:AmsterdamTheMapV3 - N. Smeding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接