2010-05-18 39 views
0

我有兩個對象,文化和翻譯,這兩個都不復雜。文化就像一個簡單的CultureInfo,但有一個額外的領域。文化可能不會經常變化,並且不會有很多開始。不過,會有很多翻譯,每個翻譯都有一個CultureID屬性。每個翻譯都有一個TranslationID,以便您可以將翻譯鏈接在一起。數據看起來像這樣:爲控件中的轉換器提供控件的依賴屬性?

TranslationID,CultureID,Text;
1,en,你好;
1,es,Hola;
2,en,Bye;
2,es,Adios;

我想建立一個控制,我可以綁定文化列表以及翻譯列表。對於每個TranslationID,可能沒有每個文化的翻譯。所以我可能會有英文,西班牙文,德文和中文作爲我的文化,但對於「你好嗎」,我可能只有英文和德文翻譯。

同一TranslationID的翻譯列表將被綁定到該控件。在控件內部,每個文化只有一個或零個翻譯。我有一個xaml Expander元素的Listbox。每個Expander應該有一個Culture,Culture.Name屬性作爲頭。如果翻譯存在,每個擴展器的內容是一個包含該文化翻譯的文本框。如果它不存在,則TextBox爲空。到目前爲止,我有這麼多的工作。

在控件之外,可以選擇其中一種文化進行編輯翻譯,即使在控件中可以編輯任何文化的翻譯。如果發生這種情況,那很好。當前編輯文化應該做的是讓擴展器在我的控制中包含非常文化,是唯一一個在控件打開時展開的控件(控件將在Popup中)。控件中列表框中的所有其他擴展器都不應展開。我在我的控制中創建了一個依賴項屬性,該屬性採用當前編輯文化,名爲CurrentTranslationCulture。

這是我的問題所在。我嘗試使用DataTrigger和自定義轉換器來進行文化與CurrentTranslationCulture的比較。但是,由於轉換器是自己的類,因此無法訪問CurrentTranslationCulture。我嘗試將它作爲ConverterParameter傳遞,但我無法將其綁定到DataTrigger的Binding中的ConverterParamater參數。我甚至不知道這是否是我應該採取的方法。有沒有人知道這個解決方案,或者甚至更好?提前致謝。

代碼:下面的代碼不能完全工作。如果你拿出ConverterParameter,它會起作用,但是我所有的擴展器都將被關閉。在ConverterParamerter中,ElementName = labelTranslationEditor是我提供給我的控件以嘗試訪問它的名稱。

<ListBox x:Name="listTranslations" AlternationCount="2"> 
       <ListBox.ItemTemplate> 
        <DataTemplate DataType="{x:Type office:Culture}"> 
         <Expander x:Name="cultureExpander" Header="{Binding Path=Name}" IsExpanded="False"> 
          <Expander.Triggers> 

          </Expander.Triggers> 
          <TextBox x:Name="tbInsertLabelText" Style="{StaticResource popupLabelTextBox}" MinWidth="300" MaxWidth="450" 
           VerticalAlignment="Top" HorizontalAlignment="Right" SpellCheck.IsEnabled="True" TextWrapping="WrapWithOverflow" /> 
         </Expander> 

         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding Path=CultureID, Converter={StaticResource expandedConverter}, ConverterParameter={Binding ElementName=labelTranslationEditor, Path=CurrentTranslationCulture}}" Value="false"> 
           <Setter TargetName="cultureExpander" Property="IsExpanded" Value="false" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
+0

爲什麼試圖重塑全球化? http://msdn.microsoft.com/en-us/library/ms788718.aspx – Will 2010-05-18 14:37:08

+0

我們在應用程序的「靜態」部分使用全球化,如工具欄菜單。這是爲了我們的數據庫驅動的數據,這是更加動態和通用的。我不清楚原因,這不是我的電話。不幸的是,我必須處理它。 – JoeSharp 2010-05-18 19:45:25

回答

0

從MSDN論壇...該解決方案的擴展問題是使用一個MultiBinding同時捕獲綁定到擴展的文化,還有CurrentTranslationCulture。然後這兩個傳入轉換器應用適當的邏輯。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/2699e07e-5eff-4499-8aec-34f6e1e298a0

這裏是唯一改變的代碼:

<DataTemplate.Triggers> 
          <DataTrigger Value="True"> 
           <DataTrigger.Binding> 
            <MultiBinding Converter="{StaticResource expandedConverter}"> 
             <Binding Path="CultureID" /> 
             <Binding ElementName="labelTranslationEditor" Path="CurrentTranslationCulture" /> 
            </MultiBinding> 
           </DataTrigger.Binding> 
           <Setter TargetName="cultureExpander" Property="IsExpanded" Value="True" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
相關問題