在属性上实现绑定扩展

时间:2012-02-29 07:17:37

标签: c# silverlight xaml c#-4.0 silverlight-5.0

我有一个控件,我们可以识别为类似于ListBox控件。每个项目都用一个元素表示(例如TextBlock)。我想要的是更改此项的布局,以便它包含两个TextBlocks。所以我创建了一个ControlTemplate,放了一个Border Grid,TwoTextBlocks,一切都很好。现在问题是:

我需要能够本地化项目中的文本,我通常这样做:

<... Text="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}" />

现在我需要能够对两个TextBlocks做同样的事情。所以我认为我需要创建一个这个项目将绑定的自定义类型,并公开两个属性:标题和描述。如果我将此属性公开为字符串类型,一切正常,但我丢失了之前使用的标记绑定。如何实现两个属性相同?结果应该是:

<... Title="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}", Description="{Binding Strings.AnotherString, Source={StaticResource ApplicationResources}}" />

我能够使用ResourcemManager类进行本地化,但是为了提供在运行时动态应用的本地化,它甚至变得复杂。

那么,为了能够使用上面的代码,我需要做什么?然后我只需要在ApplicationResource上实现INotifyPropertyChanged并且所有都已设置。

1 个答案:

答案 0 :(得分:0)

大!

我要做同样的事情。是的,我有一个解决方案,但我不确定它到现在是否有效。

首先,我们需要一个包含字典的LocalizationManager。

例如,如果您需要本地化用户帐户窗口,请执行此操作

<TextBlock Text="something, UsernameKey">

本地化管理器将UsernameKey映射到“用户名”或其他语言

第二,xaml扩展,它从LocalizationManager中找到键的值。

我想知道这个自定义扩展是否可以从Binding扩展派生,如果是这样,这将非常简单,只需为目标创建一个绑定对象。如果没有,我认为通过xaml扩展对UIElement进行WEAK引用以动态更新文本是正确的。

此解决方案很简单但不通用。从右到左阅读一些语言。它要求应用程序从右到左显示内容。

所以,我有另一个通用的解决方案,但更复杂。

我们使用附加依赖属性而不是xaml扩展。

这样做:

<TextBlock LocalizationManager.LocalizationKey="UsernameKey" />

那么,现在的问题是如何通过LocalizationManager设置“Text”属性?

我们使用适配器,LocalizationManager将搜索适当的适配器类型“TextBlock”

因此,当应用程序启动时,我们将一些适配器注册到LocalizationManager:

LocalizationManager.Current.RegisterAdapter<TextBlock>(new TextBlockAdapter())

此解决方案更通用,如果您提供适配器,它支持任何类型的控制,但正如您所见,此解决方案需要更多工作,并且比前者更复杂。

我希望这些设计解决方案能为您提供帮助〜