2

個々の ComboBoxItem 内に StackPanel を明示的にネストしたり、カスタム コントロールを使用したりすることなく、文字列値を ComboBoxItem にアタッチして ComboBoxItem のコンテンツの横に表示できるシステムをセットアップしようとしています。

そこで、「Header」という名前の DependencyProperty を作成して ComboBoxItem にアタッチし、ComboBoxItem テンプレートをオーバーライドして、Text を ComboBoxItem のアタッチされた Header プロパティにバインドする TextBlock を持つスタック パネルを含めました。

私が抱えている問題は、実行時に 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 が構築されるときに実際に呼び出されます。

私が間違っていることはありますか、それとも私が気付いていないバインディングに何らかの制限がありますか?

4

2 に答える 2

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>
于 2012-10-03T22:11:04.277 に答える
0

私はまだヘッダー バインディングをその実装で動作させていませんが、非常に簡単で便利な回避策があります。

<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>
于 2012-10-03T21:39:20.023 に答える