2011-11-23 48 views
1

我需要兩部分的值轉換爲字符串,然後再返回,例如:使用多值雙向多轉換或轉換與產權

{Value = 12.0, Units = DimensionUnits.Inches} 

轉換爲

"12 in" 

這很簡單轉換器可以從源代碼轉換,但如果用戶不在字符串中提供單元類型,則不可能轉換回來,因此多值轉換器看起來不像我需要的解決方案。

直接轉換器參數將不起作用,因爲單位類型需要綁定,因此我研究瞭如何創建可綁定參數。創建一個可綁定的參數實際上非常簡單 - 從DependencyObject派生出來 - 但是之後你的轉換器沒有生活在可視化樹中 - 因此無法綁定任何東西 - 有兩種解決方案:

http://tomlev2.wordpress.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ http://shujaatsiddiqi.blogspot.com/2011/02/wpf-binding-converter-parameter.html

第一種方法從Freezable而不是DependencyObject派生您的Converter以允許DependencyProperties。這可以工作,並允許你在Whatever.Resources部分進行綁定,但它有非常奇怪的行爲,比如只在第一次在整個應用程序中使用綁定時才監聽綁定。

第二種方法似乎根本不起作用。當源更改時,依賴項屬性永遠不會更新。

<pf:BindingReflector Target="{Binding Source={StaticResource DistanceConverter}, Path=Units, Mode=TwoWay}" 
    Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=g:TestWindow, AncestorLevel=1}, Path=Units, Mode=TwoWay}"/> 

有沒有人知道這個問題的解決方案,或者這是WPF的一個很大的侷限性?

回答

3

就個人而言,我真的建議重新考慮這個了一下,做或者:

  1. 保持最終的字符串使用IMultiValueConverter單向的,並且有這個輸入爲兩個獨立的項目。這似乎是一個合理的方法,因爲這些單元似乎是一個具有特定選項的枚舉。單位和文本框的數量組合框似乎是合適的,總顯示可以通過單向轉換器完成。

  2. 顯式地在ViewModel中處理此轉換。這具有允許更好的驗證處理的優點,這可能是需要的,因爲在一個控件中輸入兩個單獨的值(數量+單位)可能無法正確驗證。通過將邏輯直接移入您的ViewModel而不是綁定到屬性,您可以以一種乾淨的方式正確處理錯誤。

+0

1.是我原來的解決方案,但它決定在盒子內部的速記更容易立即識別,而不是隨處可見的組合框。想象一下,帶有編輯框的數據網格表示「12入」,而數據網格有2列,值爲1,單位爲1。這也有價值輸入的問題。如果用戶使用當前在「英寸」上的組合框鍵入12,然後將單位改爲「英尺」,那麼這是否意味着用戶想要1英尺或12英尺? (基本上我們應該轉換組合框更改時剛纔輸入的內容)。 – NtscCobalt

+0

再次,這實際上只是一個小例子,我使用多值轉換器或具有依賴項屬性的轉換器。總的來說,我希望看看能否以某種方式獲得帶有可轉換轉換器參數的轉換器,而不管轉換器的具體用途如何。 – NtscCobalt