C# 更改内嵌在CellTemplate中的文本框的前景
我正在尝试更改文本框的前景色(文本颜色),该文本框是GridViewColumn.CellTemplate的datatemplate,如果选择了listviewitem:C# 更改内嵌在CellTemplate中的文本框的前景,c#,wpf,C#,Wpf,我正在尝试更改文本框的前景色(文本颜色),该文本框是GridViewColumn.CellTemplate的datatemplate,如果选择了listviewitem: <ListView ItemsSource="{Binding Components}" Style="{StaticResource PrimaryListViewStyle}" ItemContainerStyle
<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>
<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>
<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,更重要的是,只适用于当前对象。如果在按钮的样式中放置触发器,则该触发器将适用于此按钮的属性。除此之外,没有其他功能。