2012-10-03 27 views
2

我試圖建立一個系統,它允許我將一個字符串值附加到ComboBoxItem並將其顯示在ComboBoxItem的內容旁邊,而不必在每個人的內部顯式嵌套一個StackPanel ComboBoxItem或使用自定義控件。控制模板的命令綁定與附加屬性

所以我所做的就是創建一個名爲「Header」的DependencyProperty並將其附加到ComboBoxItem,並且我重寫了ComboBoxItem模板以包含具有TextBlock的堆棧面板,該TextBlock將其文本綁定到附加的Header屬性的ComboBoxItem。

我遇到的問題是在運行時出現在TextBlock中的唯一文本是無論我在元數據中設置依賴屬性的默認值。此後對ComboBoxItems上附加屬性的任何更改都不會反映在TextBlock中。

這裏是我的DependencyProperty定義:

public class AttHeader : DependencyObject 
{ 
    public static readonly DependencyProperty HeaderProperty = DependencyProperty.RegisterAttached("Header", typeof(string), typeof(AttHeader)); 

    public static void SetHeader(DependencyObject d, string value) 
    { 
     d.SetValue(HeaderProperty, value); 
    } 

    public static string GetHeader(DependencyObject d) 
    { 
     return (string)d.GetValue(HeaderProperty); 
    } 
} 

這是我的風格和模板:

<Style TargetType="ComboBoxItem"> 
    <Setter Property="OverridesDefaultStyle" Value="True"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBoxItem"> 
       <StackPanel Orientation="Horizontal"> 
        <ContentPresenter /> 
        <TextBlock Name="HeaderHost" Text="{Binding Path=(local:AttHeader.Header), RelativeSource={RelativeSource Self}}" /> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

這裏是我創建幾個ComboBoxItems:

<ComboBox SelectedIndex="0"> 
    <ComboBoxItem local:AttHeader.Header="Isometric"> 
     <Image Source="../images/viewTypeIso.png" Stretch="None"/> 
    </ComboBoxItem> 
    <ComboBoxItem local:AttHeader.Header="Top"> 
     <Image Source="../images/ViewTypeTop.png" Stretch="None"/> 
    </ComboBoxItem> 
</ComboBox> 

即使設置這些ComboBoxItems創建時附加屬性的值對其沒有影響內的TextBlocks。

我假設綁定是有效的,因爲我可以爲依賴項屬性設置一個默認值,每個ComboBoxItem將始終在其圖像旁邊顯示該值。

我在SetHeader中設置了一個斷點,並且在構造這些ComboBoxItems時確實調用了它。

有沒有我做錯了或有沒有限制我不知道的綁定?

回答

2

你的綁定是不正確的,現在的TextBlock是ComboBoxItem 的孩子嘗試結合:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ComboBoxItem"> 
      <StackPanel Orientation="Horizontal"> 
       <ContentPresenter /> 
       <TextBlock Name="HeaderHost" 
          Text="{Binding Path=local:AttHeader.Header, 
            RelativeSource={RelativeSource Mode=FindAncestor 
            ,AncestorType=ComboBoxItem}}" /> 
      </StackPanel> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
+0

啊,這做到了! – Nasai

+0

嘗試使用snoop或觀察輸出窗口,您可以檢測到綁定錯誤。 –

+0

從技術上講,這是一個有效的綁定,並不會拋出任何錯誤,因爲附加的屬性並不關心你附加到哪個對象。 AFAIK,在其設置之前綁定到附加的字符串屬性將返回空字符串,即使元數據中沒有默認設置,也不會引發異常或錯誤。無論如何,我都這麼認爲。 – Nasai

0

我還沒忘了頭綁定與實施工作,但這裏有一個超級簡單方便的解決方法:使用HeaderedContentControls代替ComboBoxItems,並指示組合框通過實施以下樣式水平定向頭:

<Style TargetType="HeaderedContentControl"> 
    <Setter Property="OverridesDefaultStyle" Value="True"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="HeaderedContentControl"> 
       <StackPanel Orientation="Horizontal"> 
        <ContentPresenter /> 
        <ContentPresenter ContentSource="Header" /> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>