Binding WPF:当目标文本框具有焦点时,如何设置标签样式?

Binding WPF:当目标文本框具有焦点时,如何设置标签样式?,binding,Binding,当关联的文本框有焦点时,我想突出显示一个标签。这项工作: <Label Grid.Row="1" Grid.Column="0" Target="{Binding ElementName=CountryCode}"> <Label.Style> <Style TargetType="{x:Type Label}"> <Style.Triggers> <DataTrigger Binding="{B

当关联的文本框有焦点时,我想突出显示一个标签。这项工作:

<Label Grid.Row="1" Grid.Column="0" Target="{Binding ElementName=CountryCode}">
   <Label.Style>
    <Style TargetType="{x:Type Label}">
      <Style.Triggers>
          <DataTrigger Binding="{Binding ElementName=CountryCode, Path=(IsFocused)}" Value="True">
              <Setter Property="Foreground" Value="Blue" />
          </DataTrigger>
      </Style.Triggers>
    </Style>
   </Label.Style>
   <AccessText Text="{Binding Path=CountryCodeLabel}" />
</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="CountryCode" Text="{Binding Path=CountryCode}" />
<Style x:Key="HighlightOnFocus" TargetType="{x:Type Label}">
<Style.Triggers>
   <DataTrigger Binding="{Binding ElementName=CountryCode, Path=(IsFocused)}" Value="True">
       <Setter Property="Foreground" Value="Blue" />
   </DataTrigger>
</Style.Triggers>
</Style>
...
<Label Grid.Row="1" Grid.Column="0" Style="{StaticResource HighlightOnFocus}">
   <AccessText Text="{Binding Path=CountryCodeLabel}" />
</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="CountryCode" Text="{Binding Path=CountryCode}" />

但是我有一大堆这样的文本框,所以我更喜欢模板样式。这项工作:

<Label Grid.Row="1" Grid.Column="0" Target="{Binding ElementName=CountryCode}">
   <Label.Style>
    <Style TargetType="{x:Type Label}">
      <Style.Triggers>
          <DataTrigger Binding="{Binding ElementName=CountryCode, Path=(IsFocused)}" Value="True">
              <Setter Property="Foreground" Value="Blue" />
          </DataTrigger>
      </Style.Triggers>
    </Style>
   </Label.Style>
   <AccessText Text="{Binding Path=CountryCodeLabel}" />
</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="CountryCode" Text="{Binding Path=CountryCode}" />
<Style x:Key="HighlightOnFocus" TargetType="{x:Type Label}">
<Style.Triggers>
   <DataTrigger Binding="{Binding ElementName=CountryCode, Path=(IsFocused)}" Value="True">
       <Setter Property="Foreground" Value="Blue" />
   </DataTrigger>
</Style.Triggers>
</Style>
...
<Label Grid.Row="1" Grid.Column="0" Style="{StaticResource HighlightOnFocus}">
   <AccessText Text="{Binding Path=CountryCodeLabel}" />
</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="CountryCode" Text="{Binding Path=CountryCode}" />

...
但是我当然不能在那里硬编码元素名。所以我试了一下:

<Style x:Key="HighlightOnFocus" TargetType="{x:Type Label}">
<Style.Triggers>
   <DataTrigger Binding="{Binding Path=(IsFocused)}" Value="True">
       <Setter Property="Foreground" Value="Blue" />
   </DataTrigger>
</Style.Triggers>
</Style>
...
<Label Grid.Row="1" Grid.Column="0" Style="{StaticResource HighlightOnFocus}" DataContext="{Binding ElementName=CountryCode}">
   <AccessText Text="{Binding Path=CountryCodeLabel}" />
</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="CountryCode" Text="{Binding Path=CountryCode}" />

...

但是在标签中设置DataContext会弄乱我的AccessText元素中的绑定。所以问题是-除了设置datacontext之外,是否有其他方法指定样式datatrigger的元素名称?有没有更好的方法来完成我想做的事情?

这里有一个很好的解决方案:

一般来说,这相当容易。创建自定义附着属性,如下所示:

然后为高亮显示添加样式:


然后简单地像这样使用它:


这里有一个很好的解决方案:

一般来说,这相当容易。创建自定义附着属性,如下所示:

然后为高亮显示添加样式:


然后简单地像这样使用它:



即使我手动添加了标记,我也不知道为什么语法突出显示不起作用。无论如何,这个解决方案是有效的:)我不知道为什么语法高亮显示不起作用,即使我手动添加了标记。解决方案仍然有效:)
<Label Content="Label" Style="{StaticResource HighlightOnFocus}"
    local:CustomAttached.IsTargetFocused="{Binding IsFocused, ElementName=textBox}">
</Label>
<TextBox x:Name="textBox" Text="TextBox" />