C# 在属性上实现绑定扩展

C# 在属性上实现绑定扩展,c#,silverlight,xaml,c#-4.0,silverlight-5.0,C#,Silverlight,Xaml,C# 4.0,Silverlight 5.0,我有一个控件,我们可以将其标识为类似于ListBox控件。每个项目用一个元素表示(例如TextBlock)。我想更改此项的布局,使其包含两个文本块。所以我创建了一个ControlTemplate,放置了一个边框网格,两个TextBlock,一切都很好。现在的问题是: 我需要能够本地化项目中的文本,我通常是这样做的: <... Text="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}" /

我有一个控件,我们可以将其标识为类似于ListBox控件。每个项目用一个元素表示(例如TextBlock)。我想更改此项的布局,使其包含两个文本块。所以我创建了一个ControlTemplate,放置了一个边框网格,两个TextBlock,一切都很好。现在的问题是:

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

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

现在我需要能够对两个文本块执行相同的操作。所以我认为我需要创建一个自定义类型,该项目将绑定到该类型,并公开两个属性:Title和Description。如果我将此属性公开为字符串类型,则一切正常,但我失去了以前使用的标记绑定。如何实现两个属性的相同?结果应该是:

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

我能够使用ResourcemManager类实现本地化,但为了提供在运行时动态应用的本地化,它变得更加复杂

那么,我需要做什么才能使用上面的代码呢?然后我只需要在ApplicationResource上实现INotifyPropertyChanged,一切都设置好了。

太好了

我要做和你在这里做的一样的事。是的,我有一个解决方案,但我不确定它是否有效,直到现在

首先,我们需要一个拥有字典的本地化管理器

例如,如果需要本地化用户帐户窗口,只需执行以下操作

<TextBlock Text="something, UsernameKey">

localizationManager将UsernameKey映射到“Username”或其他语言

第二个是xaml扩展,它从LocalizationManager中查找键的值

我想知道这个自定义扩展是否可以从绑定扩展派生,如果可以,这将非常简单,只需创建一个到目标的绑定对象。如果不是,我认为通过xaml扩展保持对UIElement的弱引用来动态更新文本是合适的

这个解决方案很简单,但不是通用的。有些语言是从右向左读的。它要求应用程序从右向左显示内容

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

我们使用附加依赖属性代替xaml扩展

这样做:

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

所以,现在的问题是如何通过LocalizationManager设置“Text”属性

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

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

LocalizationManager.Current.RegisterAdapter<TextBlock>(new TextBlockAdapter())
LocalizationManager.Current.RegisterAdapter(新的TextBlockAdapter())
这个解决方案更通用,如果您提供适配器,它支持任何类型的控制,但是正如您所看到的,这个解决方案比前一个解决方案需要更多的工作和复杂得多


我希望这些设计解决方案能够帮助您~

Hi-dBear,正如我所说的,我能够让它工作,但我不喜欢这种方法,这就是我首先提出这个问题的原因。我的方法略有不同,我引入了另一个名为LocalizationResource的属性,所以文本将只包含键或纯文本。但是,这不是我喜欢的解决方案,因为它违反了标准。