Xamarin XAML x:Static 在嵌套 class 中引用 属性

Xamarin XAML x:Static reference to property in a nested class

我正在使用 Xamarin 编写一个移动应用程序,我有一个名为 Strings 的静态 class 来包装我的 RESX 资源。我想使用 x:Static 绑定到我的 XAML 文件中的这些。如果我有一个具有要绑定的静态属性的静态 class,这将起作用。

我删掉了一些评论和其他不必要的部分,但它基本上是这样的:

namespace MyCompany.Resources
{
    public static partial class Strings
    {
        public static string LabelUsername { get { return Resources.LabelUsername; } }
    }
}

然后在我的 XAML 中,我像这样绑定它:

<Entry Placeholder="{x:Static resources:Strings.LabelUsername}"

其中资源定义为

xmlns:resources="clr-namespace:MyCompany.Resources;assembly=MyCompany"

一切正常。当我将嵌套的 class 添加到字符串时,它会崩溃。 class 看起来像这样:

namespace MyCompany.Resources
{
    public static partial class Strings
    {
        public static partial class Label
        {
            public static string Username { get { return Resources.Label_Username; } }
        }
    }
}

如果我这样做,那么我会像这样在我的 XAML 中绑定它:

<Entry Placeholder="{x:Static resources:Strings.Label.Username}"

注意在 "resources:" 之后我们现在有三个级别 (Strings.Label.Username)。这似乎是失败的原因。当我这样做时,我得到编译错误: 在 xmlns clr 命名空间中找不到类型 Strings.Label:MyCompany.Resources;assembly=MyCompany

此外,我可以从我的 ViewModels 访问嵌套的 class 及其属性。有什么方法可以从 XAML 进行这项工作吗?我知道我可以绑定到 VM 中的一个变量,然后获得该引用 Strings.Label.Username,但我不想对每个资源绑定都这样做。

您的静态属性在绑定中的名称应该是

Strings+LabelUsername.Username

您不仅打错了字,而且您还试图使用圆点符号来引用嵌套的 class,但这是行不通的。

绑定使用标准的 .net 反射符号来引用属性和 classes 按名称(它们要么在字符串上使用解析器,要么直接使用反射,不能被用来检查代码库)。嵌套的 class 名称使用 + 分隔包含的 class 名称和内部 class 名称。您可以在此处阅读更多相关信息:

C# : having a "+" in the class name?