【问题标题】:Binding to a const field in Silverlight绑定到 Silverlight 中的 const 字段
【发布时间】:2010-12-28 20:03:08
【问题描述】:

我有一种情况,一些应用程序范围的值被存储为常量 - 这是一个要求,因为它们在属性定义中是必需的(属性必须在编译时解析,所以即使是静态成员也不起作用)。

我还希望能够在 XAML 文件中重用这些值。所以如果我有这样的常量:

public class MyConstants
{
   public const string Constant1 = "Hello World";
}

我想以一种方式将它们绑定到 XAML 中定义的控件,如下所示:

<TextBlock Text="{Binding MyConstants.Constant1}" />

这是否可能以直接的方式进行?我查看了绑定示例,但似乎找不到这种情况。

是否有一些我可以做的工作(也许绑定转换为通过反射动态拉取常量字段的方法的参数)

【问题讨论】:

    标签: silverlight data-binding silverlight-3.0


    【解决方案1】:

    这是我将采取的方法:-

    在整个 XAML 中,我会使用这样的 StaticResource 语法:-

    <TextBlock Text="{StaticResource MyConstants_Constant1}" />
    

    在某处创建一个静态方法,该方法返回 ResourceDictionary 并将 Type 作为参数。该函数使用反射来枚举它公开的一组公共常量。它将每个常量的字符串值添加到ResourceDictionary,根据类型名称和常量名称来制定键名称。

    在应用程序启动期间,将typeof(MyConstants) 传递给此函数,将返回的ResourceDictionaries 添加到应用程序资源MergedDictionaries 属性中的集合中。

    现在所有静态资源都应该正确解析,无需调用任何绑定或设置任何数据上下文即可使其正常工作。该值在 XAML 解析期间解析。

    【讨论】:

    • 这正是我正在寻找的解决方案,谢谢。
    • @Anthony,你能把代码贴在这里吗?我对你的描述有点困惑。谢谢。
    • 这里我也加了一个解决方案,但是视觉设计器并没有体现出来,虽然运行时效果是正确的。
    【解决方案2】:

    你可以这样做,但前提是你实现了一个返回常量的属性。绑定仅适用于属性。要完成这项工作,请将您的声明更改为:

    public class MyConstants
    {
        private const string constant1 = "Hello World";
        public string Constant1 { get { return constant1; } }
    }
    

    【讨论】:

    • 为了使其工作,DataContext 中需要有一个 MyConstants 类的实例。
    • 是的。你必须有一些东西,在某个地方,你可以得到一个实例。您可以直接在数据上下文类中实现此属性,并从那里提取常量。
    【解决方案3】:

    如果你不介意视觉设计器,我会做的

    public MyConstants
    {
        public static string Constant1 { get { return "Hello World"; } }
    }
    

    这里:

    1. static 和 getter-only 使其成为 const,
    2. 它也是一个属性,因此您可以像这样进行绑定。

      &lt;TextBlock Text="{Binding MyConstants.Constant1}" /&gt;

    但是,正如我所说,它不会反映在 Visual Studio 中的 Visual Designer (XAML) 上,这非常可惜 :-)

    【讨论】:

    • MyConstants 是一个类吗?您在此处的语法当前无法编译。 Binding 如何意识到其路径中的文字“MyConstants”实际上是指当前DataContext 的类型而不是属性?它还需要了解“Constant1”指的是这种类型的静态属性,而不是实例属性。以我的经验,这是行不通的。您使用的是什么版本的 Silverlight?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多