【问题标题】:Change foreground of a textbox embedded in a CellTemplate更改嵌入在 CellTemplate 中的文本框的前景
【发布时间】:2014-12-30 17:21:37
【问题描述】:

如果选择了 listviewitem,我正在尝试更改作为 GridViewColumn.CellTemplate 的数据模板的文本框的前景色(文本颜色):

<ListView ItemsSource="{Binding Components}"
                          Style="{StaticResource PrimaryListViewStyle}"
                          ItemContainerStyle="{DynamicResource ListViewItemContainerStyle}"
                          Width="150"
                          MinHeight="150"
                          SelectionMode="Single"
                          cal:Message.Attach="[Event SelectionChanged]=[Action ActivateAttributesView($this.SelectedItem)]">
                    <ListView.View>
                        <GridView ColumnHeaderContainerStyle="{StaticResource PrimaryGridViewColumnHeaderStyle}">
                            <GridViewColumn Header="Component Name">
                                <GridViewColumn.CellTemplate>

                                   <DataTemplate DataType="{x:Type viewModels:ComponentViewModel}">
                                        <TextBox Text="{Binding Name}">
                                            <TextBox.Resources>
                                                <Style TargetType="{x:Type TextBox}">
                                                    <Style.Triggers>
                                                        <Trigger Property="ListViewItem.IsSelected"
                                                                 Value="False">
                                                            <Setter Property="Foreground"
                                                                    Value="Green" />
                                                        </Trigger>
                                                        <Trigger Property="ListViewItem.IsSelected"
                                                                 Value="True">
                                                            <Setter Property="Foreground"
                                                                    Value="Black" />
                                                        </Trigger>
                                                    </Style.Triggers>
                                                </Style>
                                            </TextBox.Resources>
                                        </TextBox>
                                    </DataTemplate>

                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                        </GridView>
                    </ListView.View>
                </ListView>

这是一张图片。不幸的是,我不允许直接粘贴图像...:

http://de.tinypic.com/r/262s8bb/8

所选行中的文本应显示为“黑色”。

谢谢。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您的样式具有应用于它的 TextBox 的触发器。 TextBox 不知道包含的 ListViewItem 是否被选中,所以这不起作用。

    要获得与包含 ListViewItem 的连接,您可以改用 DataTrigger,让 RelativeSource 表达式沿可视化树向上移动,直到找到 ListViewItem 并绑定到它的 IsSelected 属性:

    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="Green" />
        <Style.Triggers>
            <DataTrigger
                Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"
                Value="True">
                <Setter Property="Foreground"
                        Value="Black" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

    • 成功了!天啊!我在这上面花了几个小时 :( 现在我必须快速阅读有关数据触发器的内容,以了解这里发生了什么!非常感谢,新年快乐!
    • 好的,WPF Unleashed 4.5 告诉我 DataTrigger 可用于非 DependencyProperties。但是 IsSelected 是“选择器”的附加依赖属性。我认为属性类型在这里并不重要。我需要一个 DataTrigger,因为我不必将属性命名为触发器?对吗?
    • DataTrigger 适用于任何支持更改通知的属性,无论是 DependencyProperty 还是 CLR property of an object implementing INotifiyPropertyChangedTrigger 仅适用于 DependencyProperties,更重要的是,仅适用于当前对象的属性。如果您将触发器放在按钮的样式中,它将适用于该按钮的属性。没有别的了。
    【解决方案2】:

    我认为你需要一个 DataTrigger

    <Style.Triggers>
        <DataTrigger Binding="{Binding IsSelected}" 
            Value="True">
            <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
            <Setter Property="FontSize" Value="16"/>
        </DataTrigger>
    </Style.Triggers>
    

    【讨论】:

    • 问题:TextBox 的数据上下文将是 ComponentViewModel。你不知道它是否有 IsSelected 属性。
    • 来投反对票。出了什么问题? OK 没有 ComponentViewModel 是行不通的,但值得 -1 吗?
    • 很抱歉,但我认为这是完全错误的。 1.) 默认情况下,DataTrigger 绑定到 DataContext,您不能假设存在 IsSelected 属性。 2.)“所选行中的文本应显示为黑色。”你格式化它不同。我看不出这对新用户有什么帮助。
    • @Frank DataTrigger 向前迈进了一步。 OP 已经有了 setter 属性。很酷,但我没有朝正确的方向迈出一步。
    【解决方案3】:
    1. TextBox 监听 Foreground 由 ListViewItem 改变

             <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
                  <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=Foreground}" />
              </Style>
      
    2. 当 IsSelected 属性更改时,ListViewItem 更改了 Foreground

             <Style TargetType="ListViewItem">
                  <Setter Property="Foreground" Value="Green" />
                  <Style.Triggers>
                      <Trigger Property="IsSelected" Value="True">
                          <Setter Property="Foreground" Value="Black" />
                      </Trigger>
                  </Style.Triggers>
              </Style>
      

    【讨论】:

      猜你喜欢
      • 2015-02-20
      • 2011-04-27
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2018-08-08
      • 2010-11-07
      • 2014-05-19
      • 1970-01-01
      相关资源
      最近更新 更多