2012-12-08 46 views
0

我想爲我的ComboBoxItem內容使用通用樣式,並將文本內容綁定到基礎類的不同屬性。所以這是我能想到的最好的,但綁定是硬編碼的。因此,對於使用此ItemContainerStyle綁定到組合框的每個類,我都必須實現「MainText」和「SubText」屬性。WPF組合框:如何利用帶綁定的通用ItemContainerStyle

問題是,有沒有辦法讓綁定軟編碼,以便從組合框引用的樣式可以指定使用底層類的哪些字符串屬性。

<Style TargetType="{x:Type ComboBoxItem}" x:Key="ComboBoxItemStyleA1"> 
     <Setter Property="Template" > 
      <Setter.Value> 
       <ControlTemplate TargetType="ComboBoxItem"> 

        <Border x:Name="BB" Padding="8,3,8,3" Background="DarkGreen"> 
         <StackPanel Margin="0"> 
          <TextBlock Foreground="White" FontSize="16" Text="{Binding MainText}"/> 
          <TextBlock Foreground="White" FontSize="8" Text="{Binding SubText}"/> 
         </StackPanel> 
        </Border> 
         <ControlTemplate.Triggers> 

         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Background" TargetName="BB" Value="#FF256294"/> 
          <Setter Property="Foreground" Value="White"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

而且使用的樣式......

<ComboBox ItemsSource="{Binding Items}" 
    ItemContainerStyle="{StaticResource ComboBoxItemStyleA1}" /> 

繼dowhilefor的回答(很多很多的感謝 - WPF是偉大的,但肯定是一次發現之旅)

我使用的數據模板來定義最初的單元格外觀 - 然後希望使用基於comboboxitem的樣式和定義的控件模板,我可以在其中指定onmouseover觸發器。即這些改變背景顏色等。

Butj a)我無法刪除上面模板的邊框部分 - 觸發器通過targettype =「BB」綁定到它。所以我有點想把觸發器綁定到容器上,以便數據模板可以從模板綁定中獲取背景,但不知道如何獲取此管道。

b)我意識到即使我註釋掉BB在觸發器上的特定綁定只是爲了讓它運行 - 組合框沒有找到並使用我定義的DataTemplate。似乎在我的comboboxitemstyle中定義controltemplate會停止它拾取數據模板。

我希望我在這裏有意義 - 底線是我只想要一個我可以應用觸發器的樣式,設置我的coobobox項目的背景顏色。它不應該知道數據是什麼 - 即能夠插入將(模板)綁定到該背景顏色的數據模板。

非常感謝您的快速響應。

順便說一句,我使用ItemContainerStyle與ItemTemplate中一起選擇,所以我可以在下拉列表中選擇不同的表示在框列表

回答

1

首先,這似乎不使用ItemContainerStyle了點。更確切地說,從不在ItemContainerStyle中有任何綁定到datacontext,至少不要嘗試。爲什麼?樣式用於定義組合框項目的外觀而不考慮內容。如果你想定義內容的外觀應該如何,你可以使用一個DataTemplate。有多種方法可以告訴組合框,他可以在其中爲您提供的數據找到適當的DataTemplate。檢查物業ItemTemplate,ItemTemplateSelector和搜索隱式樣式,以瞭解更多關於它們。

因此,爲您的問題,爲您創建一個ItemContainerStyle combobox(如果你真的不得不了),不關心將被放入的對象。現在您仍然需要提供多個DataTemplates,每個人都知道您想要模板化的數據對象。沒有辦法繞過它,沒有軟數據綁定。只是儘量保持你的模板小而簡單。如果由於某種原因,您需要完全相同的模板,但是您的屬性命名不同,爲什麼不使用DataContext的包裝器項目(屬性爲Caption,Description),並且您可以在代碼中決定這些屬性如何填充真實數據進入這個對象。

+0

我可能比理解WPF更接近理解 - 我同意你所說的所有建議,特別是保持綁定遠離樣式......這真的是我想要做的。 (順便說一句,我同意你寫一個包含「caption」和「description」的包裝類作爲我想要做的非常好的乾淨解決方案 - 意味着所有組合框將具有相同的外觀和感覺以及一個不錯的解決方案...我可以使用這個,但現在我想嘗試解決這個難題....) –

+0

對不起 - 新的stackoverflow - 讓我完成我說的話。 –

+0

我編輯我的問題,而不是在這裏的意見,謝謝dowhilefor。 –