我想为我的ComboBoxItem内容使用通用样式,并将文本内容绑定到我的基础类上的不同属性。所以这是我能想到的最好的,但绑定是硬编码的。因此,对于使用ItemContainerStyle绑定到组合框的每个类,我都必须实现"MainText"one_answers"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很棒,但肯定是一次探索之旅)
我最初使用了一个数据模板来定义单元格外观,然后想使用一个基于comboxitem的样式,并定义一个控制模板,在那里我可以指定onmouseover触发器。即改变背景颜色等。
Butja) 我无法删除上面模板的Border部分-触发器通过targettype="BB"与之绑定。所以我有点想把触发器绑定到容器上,这样数据模板就会从模板绑定中获取背景,但不知道如何将其引入。
b) 我意识到,即使我只是为了让它运行而注释掉触发器上的BB特定绑定,组合框也不会找到并使用我定义的DataTemplate。似乎在我的comboxitemstyle中定义了controltemplate可以阻止它获取数据模板。
我希望我在这里有意义——最重要的是,我只想要一种风格,我可以在设置我的cobobox项目的背景颜色的触发器中应用它。它不应该知道数据是什么——也就是说,能够插入一个将(template?)绑定到此背景颜色的数据模板。
非常感谢您的快速响应。
顺便说一句,我将ItemContainerStyle与ItemTemplate结合使用,这样我就可以在下拉列表中使用与组合框列表中显示的不同的表示形式
首先不要使用ItemContainerStyle
。更准确地说,永远不要在ItemContainerStyle
内对数据上下文进行任何绑定,至少不要尝试。为什么?样式用于定义组合框项目的外观,而不考虑内容。如果您想定义内容的外观,可以使用DataTemplate。有多种方法可以告诉组合框在哪里可以为您提供的数据找到合适的DataTemplate。签出属性ItemTemplate
、ItemTemplateSelector
并搜索隐式样式,以了解有关它们的更多信息。
因此,对于您的问题,为您的组合框创建一个ItemContainerStyle
(如果您真的必须这样做的话),它不关心将要放入的对象。现在,您仍然需要提供多个DataTemplates,每个人都了解要模板化的数据对象。没有办法绕过它,没有软数据绑定。只要尽量保持你的模板小而简单。如果出于某种原因,您需要完全相同的模板,但您的属性只是命名不同,那么为什么不使用具有属性Caption
、Description
的DataContext的包装项呢?您可以在代码中决定如何用包装到该对象中的真实数据填充这些属性。