我想为我的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很棒,但肯定是发现之旅)
我使用数据模板来定义最初的单元格外观 - 然后想要使用基于组合框架的样式和定义的控件模板,我可以在其中指定onmouseover触发器。即这些是改变背景颜色等。
Butj a)我无法删除上面模板的Border部分 - 触发器通过targettype =“BB”绑定到它。所以我有点想让触发器绑定到容器,这样datatemplate就会从模板绑定中获取背景,但不知道如何将其连接到其中。
b)我意识到即使我在触发器上注释出BB特定的绑定只是为了让它运行 - 组合框也找不到并使用我定义的DataTemplate。似乎在我的comboboxitem风格中定义controltemplate会阻止它获取datatemplate。
我希望我在这里有意义 - 底线是我只想要一个我可以应用触发器的样式,设置我的cobobox项目的背景颜色。它不应该知道数据是什么 - 即能够插入将(模板?)绑定到此背景颜色的数据模板。
非常感谢非常快速的回应。
btw我正在使用ItemConmpinerStyle与ItemTemplate结合使用,因此我可以在下拉列表中显示组合框列表中显示的内容
答案 0 :(得分:1)
首先,不要使用ItemContainerStyle
。更准确地说,ItemContainerStyle
内的datacontext没有任何绑定,至少不要尝试。为什么?样式用于定义组合框项目的外观,而不考虑内容。如果要定义内容的外观,请使用DataTemplate。告诉组合框有多种方法可以为您提供的数据找到合适的DataTemplate。查看属性ItemTemplate
,ItemTemplateSelector
并搜索隐式样式,以了解有关它们的更多信息。
所以对你的问题,为你的组合框创建一个ItemContainerStyle
(如果你真的不得不),它不关心将要放入的对象。现在,您仍然需要为每个人提供多个DataTemplate,并了解您想要模板化的数据对象。没有办法解决它,没有软数据绑定。试着让你的模板小而简单。如果由于某种原因您需要完全相同的模板,但您的属性命名不同,为什么不使用包含属性Caption
,Description
的DataContext的包装项,您可以在代码中决定这些属性将包含在此对象中的实际数据。