2014-11-21 40 views
0

我需要創建一個特定格式的字符串,爲此我使用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提供值?

回答

0

當一些字符串(Binding)也需要使用IMultiValue轉換器時。

爲什麼不把字符串的IMultivalue轉換器的智能轉化爲專門的班級誰是ToString()將輸出基於當前的環境設置正確的字符串?這將消除您所描述的多值轉換器的需求,但是可以在父MultiValue轉換器的框架內工作。

我推薦的超級分類字符串類只需要訂閱一個事件通知它使用哪個字典。然後當調用ToString()時,正確的字符串被傳遞到頂層轉換器。

+0

讓我們假設我使用IValueConverter,在那裏我返回本地化爲當前語言的字符串。這意味着我們不需要將字典傳遞給綁定。但是,如果語言(字典)更改,那麼綁定顯示的值將如何更改? – Goran 2014-11-21 22:34:05

+0

@Goran你需要通過訂閱'System.Windows.Input.InputLanguageManager.Current.InputLanguageChanged'來檢測語言的變化,然後調用一個PropertyChanged更新來控制哪些會受到影響,比如'OnPropertyChanged(new PropertyChangedEventArgs(string.Empty) );'。 – OmegaMan 2014-11-21 23:55:57

+0

..這是我想避免的一些問題,因爲它導致了混亂的代碼和無聲的錯誤。試想幾百行我爲每個受影響的屬性調用OnPropertyChanged方法。我試圖找到一種方法,在查看UI xaml時,明確瞭解哪些屬性依賴於哪些值。 – Goran 2014-11-22 02:04:45