C# 更改内嵌在CellTemplate中的文本框的前景

C# 更改内嵌在CellTemplate中的文本框的前景,c#,wpf,C#,Wpf,我正在尝试更改文本框的前景色(文本颜色),该文本框是GridViewColumn.CellTemplate的datatemplate,如果选择了listviewitem: <ListView ItemsSource="{Binding Components}" Style="{StaticResource PrimaryListViewStyle}" ItemContainerStyle

我正在尝试更改文本框的前景色(文本颜色),该文本框是GridViewColumn.CellTemplate的datatemplate,如果选择了listviewitem:

<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>
       <Style TargetType="ListViewItem">
            <Setter Property="Foreground" Value="Green" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Black" />
                </Trigger>
            </Style.Triggers>
        </Style>

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

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

       <Style TargetType="ListViewItem">
            <Setter Property="Foreground" Value="Green" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Black" />
                </Trigger>
            </Style.Triggers>
        </Style>
所选行中的文本应显示为“黑色”

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

Thx.

我想你需要一个数据触发器

<Style.Triggers>
    <DataTrigger Binding="{Binding IsSelected}" 
        Value="True">
        <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
        <Setter Property="FontSize" Value="16"/>
    </DataTrigger>
</Style.Triggers>
       <Style TargetType="ListViewItem">
            <Setter Property="Foreground" Value="Green" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Black" />
                </Trigger>
            </Style.Triggers>
        </Style>

您的样式对其应用的文本框具有触发器。文本框不知道是否选择了包含ListViewItem的项,因此这不起作用

       <Style TargetType="ListViewItem">
            <Setter Property="Foreground" Value="Green" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Black" />
                </Trigger>
            </Style.Triggers>
        </Style>
要获得到包含ListViewItem的连接,可以使用数据触发器,让相对资源表达式沿可视树向上移动,直到找到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>
       <Style TargetType="ListViewItem">
            <Setter Property="Foreground" Value="Green" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Black" />
                </Trigger>
            </Style.Triggers>
        </Style>

  • 文本框侦听前景已从ListViewItem更改

           <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=Foreground}" />
            </Style>
    
           <Style TargetType="ListViewItem">
                <Setter Property="Foreground" Value="Green" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Foreground" Value="Black" />
                    </Trigger>
                </Style.Triggers>
            </Style>
    
    
    
  • 当IsSelected属性更改时,ListViewItem更改了前台

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

  • 问题:文本框的数据上下文将是ComponentViewModel。你不知道那是不是有选举产生的财产,来投票吧。出了什么问题?好的,如果没有ComponentViewModel,is将无法工作,但它值得a-1吗?很抱歉,但我认为它显然是错误的。1.)默认情况下,DataTrigger绑定到DataContext,并且不能假设存在IsSelected属性。2.“所选行中的文本应显示为黑色。”您将其设置为不同的格式。我看不出这对新用户有什么帮助。@Frank DataTrigger是一个进步。OP已具有setter属性。很酷,但我没有-朝着正确的方向迈出一步。这就成功了!天哪!我花了几个小时在这个问题上:(现在我必须快速阅读关于datatriggers的内容,以了解这里发生了什么!Thx很多,新年快乐!好的,WPF发布的4.5告诉我DataTrigger可以用于非依赖性属性。但是IsSelected是“Selector”中附加的依赖性属性。我认为属性类型在这里并不重要。我需要一个DataTrigger,因为我不必将属性命名为带有触发器的属性?对吗?DataTrigger适用于任何支持更改通知的属性,无论是DependencyProperty还是.Trigger,它只适用于DependencyProperties,更重要的是,只适用于当前对象。如果在按钮的样式中放置触发器,则该触发器将适用于此按钮的属性。除此之外,没有其他功能。