2012-02-29 73 views
0

我有一個控件,我們可以將其識別爲與ListBox控件類似。每個項目都用一個元素表示(示例TextBlock)。我想要的是更改此項目的佈局,以便它包含兩個TextBlocks。所以我創建一個ControlTemplate,放置一個邊界網格,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,並且全部設置完成。

回答

0

太棒了!

我打算做同樣的事情,你在這裏做。是的,我有一個解決方案,但我不確定它是否可以工作到現在。

首先,我們需要一個包含字典的LocalizationManager。

例如,如果您需要本地化的用戶帳戶窗口,只是這樣做

<TextBlock Text="something, UsernameKey"> 

而且localizationManager將映射UsernameKey爲「用戶名」或其他語言

其次,XAML擴展,從LocalizationManager中找到密鑰的值。

我不知道這個自定義擴展是否可以從Binding擴展派生,如果是的話,這將非常容易,只需創建一個綁定對象到目標。如果沒有,我認爲通過xaml擴展來對UIElement的WEAK引用進行動態更新是正確的。

該解決方案很簡單,但不是通用的。有一些語言從右到左閱讀。它要求應用程序從右向左顯示內容。

所以,我有另一個通用的解決方案,但更復雜。

取代xaml擴展,我們使用附加依賴項屬性。

做這樣的:

<TextBlock LocalizationManager.LocalizationKey="UsernameKey" /> 

所以,現在的問題是如何通過LocalizationManager設置「文本」屬性?

我們使用的適配器,LocalizationManager將搜索類型「的TextBlock」

所以,當應用程序啓動相應的適配器,我們註冊了一些適配器LocalizationManager:

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

該解決方案是比較通用的,它支持任何類型的控制,如果你提供適配器,但正如你所看到的,這個解決方案需要更多的工作,比前者更復雜。

我希望這些設計解決方案可以幫助你〜

+0

嗨dBear,正如我剛纔所說,我能夠讓它工作,但我不喜歡的方式,這就是爲什麼我問的問題在第一地點。我的方法略有不同,我引入了另一個名爲LocalizationResource的方法,所以Text只能包含鍵或純文本。但仍然不是我喜歡的解決方案,因爲它違反了標準。 – Goran 2012-03-09 16:04:33