我需要創建一個特定格式的字符串,爲此我使用IMultiValueConverter。例如:擴展綁定類以提供可綁定的轉換器參數
{0} of {1} in {2}
SomeValue0
SomeValue1
SomeValue2
結果:
SomeValue0 of SomeValue1 in SomeValue2
這部分是沒有問題的。基本上,轉換器接受多個字符串,其中第一個是字符串格式,後面是要格式化的字符串。
<MultiBinding Converter={...}>
<Binding>
<Binding.Source>{0} of {1} in {2}</Binding.Source>
</Binding>
<Binding Path="Value0" />
<Binding Path="Value1" />
<Binding Path="Value2" />
</MultiBinding>
當一些字符串(Binding)也需要使用IMultiValue轉換器時,它會變得棘手。想象一下,對於不同的語言,屬性#Value1#具有不同的值。通常情況下,我們得到這樣的價值也使用IMultiValueConverter:
<TextBox>
<TextBox.Text>
<MultiBinding Converter={...}>
<Binding Path="Value1"?
<Binding Path="Strings" Source="{StaticResource langResources}" />
</MultiBinding>
</TextBox.Text>
</TextBox>
當用戶切換到不同的語言中,字符串的詞典被更新,和TextBox接收到新的值(同樣適用於改變值值1)。
現在的問題是:在IMultiValueConverter裏面不可能使用IMultiValueConverter。您也無法爲BindingBase重寫ProvideValue,並且IMultiValueConverter將只接受BindingBase類型的對象。
有沒有什麼辦法可以以某種方式擴展BindingBase,以便它公開一個BindableConverterProperty,它的值將用於從Binding提供值?
讓我們假設我使用IValueConverter,在那裏我返回本地化爲當前語言的字符串。這意味着我們不需要將字典傳遞給綁定。但是,如果語言(字典)更改,那麼綁定顯示的值將如何更改? – Goran 2014-11-21 22:34:05
@Goran你需要通過訂閱'System.Windows.Input.InputLanguageManager.Current.InputLanguageChanged'來檢測語言的變化,然後調用一個PropertyChanged更新來控制哪些會受到影響,比如'OnPropertyChanged(new PropertyChangedEventArgs(string.Empty) );'。 – OmegaMan 2014-11-21 23:55:57
..這是我想避免的一些問題,因爲它導致了混亂的代碼和無聲的錯誤。試想幾百行我爲每個受影響的屬性調用OnPropertyChanged方法。我試圖找到一種方法,在查看UI xaml時,明確瞭解哪些屬性依賴於哪些值。 – Goran 2014-11-22 02:04:45