1

ComboBoxItemコンテンツに汎用スタイルを利用し、テキストコンテンツを基になるクラスのさまざまなプロパティにバインドしたいと考えています。ですから、これは私が思いつくことができる最高のものですが、バインディングはハードコーディングされています。したがって、このItemContainerStyleを使用してコンボボックスにバインドされたすべてのクラスに対して、「MainText」および「SubText」プロパティを実装する必要があります。

質問は、バインディングをソフトコーディングして、コンボボックスから参照されるスタイルで、基になるクラスのどの文字列プロパティを使用するかを指定できるようにする方法はありますか。

<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は素晴らしいですが、確かに発見の航海です)

データテンプレートを使用して元々セルの外観を定義しました。次に、マウスオーバートリガーを指定できるコントロールテンプレートを定義したコンボボックスアイテムベースのスタイルを使用したいと考えました。つまり、これらは背景色などを変更するためのものでした。

Butj a)上記のテンプレートのBorderセクションを削除できませんでした-トリガーはtargettype="BB"によってそれに関連付けられています。そのため、データテンプレートがテンプレートバインディングから背景を取得するように、トリガーをコンテナーにバインドしたかったのですが、これをどのように組み込むかがわかりません。

b)トリガーのBB固有のバインディングをコメントアウトして実行するだけでも、コンボボックスは定義したDataTemplateを見つけて使用しないことに気付きました。私のcomboboxitemstyleでcontroltemplateを定義すると、datatemplateの取得が停止するようです。

ここで意味があることを願っています-肝心なのは、コボボックスアイテムの背景色を設定するトリガーで適用できるスタイルが欲しいということです。データが何であるかを知る必要はありません。つまり、この背景色に(テンプレート?)バインドするデータテンプレートをプラグインできる必要があります。

非常に速い応答に感謝します。

ところで、ItemContainerStyleをItemTemplateと組み合わせて使用​​しているので、ドロップダウンでコンボボックスリストに表示されるものとは異なる表現を使用できます。

4

1 に答える 1

1

まず第一に、そのItemContainerStyleためにを使用しないでください。より正確に言うと、 内の datacontext への Binding は絶対に持たないItemContainerStyleでください。少なくとも試してみてください。なんで?Style は、コンテンツを無視してコンボボックス項目の外観を定義するために使用されます。コンテンツがどのように見えるかを定義したい場合は、そのために DataTemplate を使用します。提供するデータの適切な DataTemplate を見つけることができる場所をコンボボックスに伝える方法は複数あります。プロパティItemTemplateをチェックアウトし、ItemTemplateSelector暗黙的なスタイルを検索して詳細を確認してください。

したがって、あなたの問題に対して、ItemContainerStyle入れられるオブジェクトを気にしないコンボボックスを作成します(本当に必要な場合)。ここで、複数の DataTemplates を提供し、テンプレート化するデータ オブジェクトの知識を全員に提供する必要があります。それを回避する方法はありません。ソフトデータバインディングはありません。テンプレートを小さくシンプルに保つようにしてください。なんらかの理由でまったく同じテンプレートが必要であるが、プロパティの名前が異なるだけの場合は、 properties を使用して DataContext のラッパー項目を使用しないCaptionDescriptionください。これらのプロパティが実際のデータでどのように満たされるかをコードで決定できます。物体。

于 2012-12-08T02:18:17.967 に答える