WPF ComboBox:如何使用带有绑定的通用ItemContainerStyle

时间:2012-12-08 00:14:15

标签: wpf styles bind itemcontainerstyle

我想为我的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结合使用,因此我可以在下拉列表中显示组合框列表中显示的内容

1 个答案:

答案 0 :(得分:1)

首先,不要使用ItemContainerStyle。更准确地说,ItemContainerStyle内的datacontext没有任何绑定,至少不要尝试。为什么?样式用于定义组合框项目的外观,而不考虑内容。如果要定义内容的外观,请使用DataTemplate。告诉组合框有多种方法可以为您提供的数据找到合适的DataTemplate。查看属性ItemTemplateItemTemplateSelector并搜索隐式样式,以了解有关它们的更多信息。

所以对你的问题,为你的组合框创建一个ItemContainerStyle(如果你真的不得不),它不关心将要放入的对象。现在,您仍然需要为每个人提供多个DataTemplate,并了解您想要模板化的数据对象。没有办法解决它,没有软数据绑定。试着让你的模板小而简单。如果由于某种原因您需要完全相同的模板,但您的属性命名不同,为什么不使用包含属性CaptionDescription的DataContext的包装项,您可以在代码中决定这些属性将包含在此对象中的实际数据。