2016-01-21 95 views
1

如何将一个样式设置器的前景色绑定到另一个样式设置器上的填充颜色,它应该是相同的对象类型。这是我得到的代码!从不同风格绑定到样式设置器

获得这些错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=MenuItemPath'. BindingExpression:Path=Fill; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Foreground' (type 'Brush')

<Style x:Key="MenuItemName" TargetType="TextBlock"> 
     <Setter Property="Foreground" Value="{Binding ElementName=MenuItemPath, Path=Fill}" /> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="VerticalAlignment" Value="Center" /> 
     <Setter Property="HorizontalAlignment" Value="Left" /> 
    </Style> 

    <ControlTemplate x:Key="MenuItem" TargetType="RadioButton"> 
     <ControlTemplate.Resources> 
      <Style TargetType="Path" x:Name="MenuItemPath"> 
       <Setter Property="Fill" Value="#FF22252C" /> 
       <Setter Property="Height" Value="25" /> 
       <Setter Property="Width" Value="25" /> 
       <Setter Property="Stretch" Value="Uniform" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type RadioButton}}, Path=IsChecked}" Value="True"> 
         <Setter Property="Fill" Value="White" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ControlTemplate.Resources> 

回答

1

我个人创建不同的资源用于存储刷色,并从两个位置引用它。

<SolidColorBrush Color="#FF22252C" x:Key="MenuFillColor" /> 

<Style x:Key="MenuItemName" TargetType="TextBlock"> 
    <Setter Property="Foreground" Value="{StaticResource MenuFillColor}" /> 
    ... 
</Style> 

<ControlTemplate x:Key="MenuItem" TargetType="RadioButton"> 
    <ControlTemplate.Resources> 
     <Style TargetType="Path" x:Name="MenuItemPath"> 
      <Setter Property="Fill" Value="{StaticResource MenuFillColor}" /> 
      ... 
     </Style> 
    </ControlTemplate.Resources> 
</ControlTemplate> 

这么说,我从来没有真正尝试过绑定到另一个风格的Setter.Value财产......有可能承担一切都是相同的范围内。你看起来像你可能有不同的范围,因为你正在使用<ControlTemplate.Resources>来限制你的MenuItemPath风格的范围只是ControlTemplate。但个人我不会尝试它,并会假设任何需要这样的需求也可以做一些更好的方式:)

+0

嗯,这个想法是路径和前景将是相同的颜色,但路径颜色是由触发器更改取决于如果RadioButton IsChecked。 –

+0

@MartynBall在这种情况下,您需要绑定到应用模板的'Path.Fill'属性。当触发器改变'Path.Fill'属性时,样式的'Setter.Value'属性不会改变。我不确定你的代码是什么样子的,但是如果你想用显示控制模板的代码来更新你的问题,那么Style就是我可以尝试提出建议的地方。 – Rachel

0

我正在使它比需要更复杂,我刚刚添加了一个DataTrigger修复问题:

<Style x:Key="MenuItemName" TargetType="TextBlock"> 
     <Setter Property="Foreground" Value="Black" /> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="VerticalAlignment" Value="Center" /> 
     <Setter Property="HorizontalAlignment" Value="Left" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked, ElementName=MenuItemRadio}" Value="True"> 
       <Setter Property="Foreground" Value="White" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
1

不可能访问wpf中另一个样式的外部属性,这就是为什么你有绑定错误。相反,您可以在资源中声明颜色,并从可以访问的地方声明颜色。