2010-07-07 105 views
7

我们有一个不使用传统资源文件的动态语言系统;而是通过语言管理器库从数据库获取资源。基于传统(VB6)解决方案,它的语言根据控件的标签属性中的资源名称进行控制。在页面初始化之后,我们引发一个采用LayoutRoot的方法,并递归它的子应用字符串的控件从标签中查找字符串。这被证明是笨拙的,递归例程变成了怪物来迎合不同控件的微妙之处,我想改为使用数据绑定来应用字符串。是否有可能将数据绑定到Silverlight中的方法?

我意识到我可以声明属性来绑定到每个控件,但这会涉及很多代码,我希望有更好的方法。有没有办法绑定到一个方法,传递一个参数。我设想了一个像这样的方法。

public string GetResource(string resourceName) 
{ 
    string resource = <fetch resource from language manager>; 

    if (String.IsNullOrEmpty(resource)) 
    { 
    return resourceName; 
    } 
    else 
    { 
    return resource; 
    } 
} 

我们在我们的应用程序中已经有一个静态方法用于检索,它有以下签名。

public static Resource(string resourceName, string defaultValue) 

为了能够直接使用,会很好。

+2

您刚刚使用“语言”作为动词吗? *不寒而栗* – 2010-07-07 13:44:48

+0

我做了,我认识到它是对语言的滥用。你会推荐什么动词?翻译似乎不适合我描述的内容。 – 2010-07-07 14:55:55

+0

“初始化”,“翻译”,“应用资源” – 2010-07-07 15:02:58

回答

4

您可以使用value converter,然后传递一个参数来查找资源。因为你的值转换器可以忽略这个部分并且只是使用通过的ConverterParameter来执行你的资源查找,所以绑定的属性并不一定重要。

然后,您可以在App资源中创建资源转换器的实例,并在整个应用程序中使用它。

... SomeProperty="{Binding Converter={StaticResource MyAppResourceConverter}, 
          ConverterParameter=SomePropertyResourceName}}" ... 
+1

这很好,谢谢。 – 2010-07-07 14:59:20

+0

@Steve:没问题。我不得不做类似的事情(虽然不是资源),并且偶然发现了这种厚颜无耻的做法。 :) – 2010-07-07 15:02:08