我試圖建立一個系統,它允許我將一個字符串值附加到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時確實調用了它。
有沒有我做錯了或有沒有限制我不知道的綁定?
啊,這做到了! – Nasai
嘗試使用snoop或觀察輸出窗口,您可以檢測到綁定錯誤。 –
從技術上講,這是一個有效的綁定,並不會拋出任何錯誤,因爲附加的屬性並不關心你附加到哪個對象。 AFAIK,在其設置之前綁定到附加的字符串屬性將返回空字符串,即使元數據中沒有默認設置,也不會引發異常或錯誤。無論如何,我都這麼認爲。 – Nasai