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 很棒,但肯定是一次发现之旅)

我最初使用数据模板来定义单元格外观 - 然后想使用基于组合框的样式和定义的控件模板,我可以在其中指定 onmouseover 触发器。即这些是为了改变背景颜色等。

Butj a) 我无法删除上面模板的边框部分 - 触发器通过 targettype="BB" 绑定到它。所以我有点想将触发器绑定到容器,这样数据模板就会从模板绑定中获取背景,但不知道如何将其插入。

b)我意识到,即使我注释掉触发器上的 BB 特定绑定只是为了让它运行——组合框也找不到并使用我定义的 DataTemplate。似乎在我的 comboboxitemstyle 中定义 controltemplate 会阻止它拾取数据模板。

我希望我在这里说得通 - 底线是我只想要一种样式,我可以使用触发器来设置我的 cobobox 项目的背景颜色。它不应该知道数据是什么 - 即能够插入将(模板?)绑定到此背景颜色的数据模板。

非常感谢您的快速响应。

顺便说一句,我将 ItemContainerStyle 与 ItemTemplate 结合使用,因此我可以在下拉列表中使用与组合框列表中显示的内容不同的表示形式

4

1 回答 1

1

首先不要使用ItemContainerStyle。更准确地说,永远不要对 内部的数据上下文有任何绑定ItemContainerStyle,至少不要尝试。为什么?Style 用于定义组合框项目的外观,而不管内容。如果要定义内容的外观,请使用 DataTemplate。有多种方法可以告诉组合框他可以在哪里为您提供的数据找到合适的 DataTemplate。签出该属性并搜索隐式样式ItemTemplateItemTemplateSelector以了解有关它们的更多信息。

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

于 2012-12-08T02:18:17.967 回答