对属性实现绑定扩展

本文关键字:扩展 绑定 实现 属性 | 更新日期: 2023-09-27 18:26:03

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

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

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

现在,我需要能够对两个TextBlock都做同样的操作。所以我想我需要创建一个自定义类型,该项将绑定到该类型,并公开两个属性:Title和Description。如果我将这些属性公开为字符串类型,一切都可以正常工作,但我正在失去以前使用的标记绑定。如何用两种属性实现相同?结果应该是:

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

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

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

对属性实现绑定扩展

太棒了!

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

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

例如,如果您需要本地化用户帐户窗口,只需执行以下即可

<TextBlock Text="something, UsernameKey">

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

其次,一个xaml扩展,它从LocalizationManager中查找键的值。

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

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

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

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

这样做:

<TextBlock LocalizationManager.LocalizationKey="UsernameKey" />

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

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

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

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

这个解决方案更通用,如果您提供适配器,它支持任何类型的控制,但正如您所看到的,这个解决方案需要比前一个解决方案更多的工作和复杂得多。

我希望这些设计解决方案可以帮助您~