【问题标题】:DataTriggers and ComboBox in WPFWPF 中的数据触发器和组合框
【发布时间】:2019-05-17 20:30:34
【问题描述】:

当 ItemsSource 不包含使用 DataTriggers 的项目时,如何更改 ComboBox 的颜色?

<ComboBox ItemsSource="{Binding MyData}">
    <ComboBox.Style>
        <Style TargetType="{x:Type ComboBox}">
            <Style.Triggers>
                <DataTrigger Binding="">
                    <Setter Property="BorderBrush" Value="Red" />
                    <Setter Property="BorderThicknes" Value="2"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

【问题讨论】:

  • 你试过&lt;DataTrigger Binding="MyData.Count" Value="0"&gt;吗?
  • &lt;Trigger Property="HasItems" Value="False"&gt;
  • 确保您没有根据您的组合框定义设置背景,因为样式不起作用!我的第一条评论也应该是Binding="{Binding MyData.Count}"

标签: wpf mvvm datatrigger itemssource


【解决方案1】:

如果您查看组合框的模板,就会发现一些问题潜伏在那里,即在切换按钮模板上设置的值的形式。

右键单击您的组合并使用属性>杂项以提取模板。 看看那里称为“templateroot”的边框:

  <ControlTemplate TargetType="{x:Type ToggleButton}">
        <Border x:Name="templateRoot" 
                 BorderBrush="#FFACACAC" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
                 <Border.Background>

您需要添加一个 xmlns: xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" 将 BorderBrush 更改为也绑定到 Templatedparent

 <ControlTemplate TargetType="{x:Type ToggleButton}">
         <Border x:Name="templateRoot" 
                  BorderBrush="{TemplateBinding BorderBrush}"

然后您可以看到它发生了变化。 在这里,我给了它一个默认值绿色,所以很明显这些变化正在做任何事情:

        <ComboBox.Style>
            <Style TargetType="{x:Type ComboBox}">
                <Setter Property="BorderBrush" Value="Green" />
                <Setter Property="BorderThickness" Value="2" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="false">
                        <Setter Property="BorderBrush" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>

您也可以使用:

  <DataTrigger Binding="{Binding ItemsSource.Count, RelativeSource={RelativeSource Self}}" Value="0">
         <Setter Property="BorderBrush" Value="Red" />
         </DataTrigger>

 <Trigger Property="HasItems" Value="false">
        <Setter Property="BorderBrush" Value="Red" />
  </Trigger>

以上是在windows 10上测试的。

【讨论】:

  • 既然有&lt;Trigger Property="HasItems"&gt;,为什么还要&lt;DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}"&gt;?没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多