【问题标题】:WPF ComboBox: How to you utilise a generic ItemContainerStyle with bindingWPF ComboBox:如何使用具有绑定的通用 ItemContainerStyle
【发布时间】:2012-11-26 05:15:53
【问题描述】:

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

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

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

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

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

非常感谢您的快速响应。

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

【问题讨论】:

    标签: wpf styles bind itemcontainerstyle


    【解决方案1】:

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

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

    【讨论】:

    • 我可能比我想象的更接近于理解 WPF - 我同意你所说的一切,特别是在保持绑定远离样式方面......这确实是我想做的。 (顺便说一句,我同意你写一个带有“标题”和“描述”的包装类作为我想要做的一个很好的干净解决方案 - 意味着所有组合框都将具有相同的外观和感觉以及一个不错的解决方案...我可能会使用它,但现在我想尝试解决这个难题....)
    • 对不起 - stackoverflow 的新手 - 让我完成我所说的。
    • 我编辑了我的问题,而不是在 cmets 中,谢谢 dowhilefor。
    • 另一个更愚蠢的想法是。将您的属性绑定到对象,而不是属性,并使用带参数的值转换器为给定对象返回正确的值。但它又是一个非常奇怪的解决方案
    猜你喜欢
    • 2018-11-08
    • 2011-11-01
    • 2015-04-07
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多