2013-07-26 44 views
0

在我的窗口中,我有一系列的六个按钮,用于指示ViewModel的其中一个属性的六种可能状态。活跃的那个需要被强调。要做到这一点,我创建的按钮下面的ControlTemplate:XAML中来自ControlTemplate的访问按钮的标记属性

<ControlTemplate x:Key="SnijRichtingTemplate" TargetType="Button"> 
    <Border Name="toggleButton" BorderThickness="1" BorderBrush="{StaticResource KleurRadioCheckOuter}" Background="Transparent" Width="20" Height="20" Cursor="Hand"> 
     <TextBlock Name="text" Foreground="{StaticResource KleurRadioCheckOuter}" 
        Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" 
        ToolTip="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag.ToolTip}" 
        HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Border> 

    <ControlTemplate.Triggers> 
     <DataTrigger Value="True"> 
      <DataTrigger.Binding> 
       <MultiBinding Converter="{StaticResource EqualityToBooleanConverter}"> 
        <Binding Path="SnijRichting" /> 
        <Binding Path="Tag" RelativeSource="{RelativeSource TemplatedParent}" /> 
       </MultiBinding> 
      </DataTrigger.Binding> 
      <Setter TargetName="toggleButton" Property="BorderBrush" Value="{StaticResource KleurTekstDonker}" /> 
      <Setter TargetName="text" Property="Foreground" Value="{StaticResource KleurTekstDonker}" /> 
     </DataTrigger> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="toggleButton" Property="BorderBrush" Value="{StaticResource Kleur2}" /> 
      <Setter TargetName="text" Property="Foreground" Value="{StaticResource Kleur2}" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

模板然后用像这样:

<Button Grid.Column="0" Template="{StaticResource SnijRichtingTemplate}" 
     HorizontalAlignment="Right" Click="SnijRichting_Click" 
     Tag="{StaticResource XLinks}" /> 

当标签只是在XAML中定义一个实例:

<wg:SnijRichting x:Key="XLinks" SnijAs="X" Negatief="True" /> 

的MultibindingConverter是没有任何幻想:

public class EqualityToBooleanConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return values[0] == values[1]; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

基本上,每个按钮都有一个带有新值的标签。在点击处理程序中,ViewModel的属性设置为按钮的标记。通过检查按钮的标签是否等于ViewModel属性来更新按钮状态。

问题是这不起作用。当EqualityToBooleanConverter被执行时,第二个值为空。通过从第二个绑定中删除Path =“Tag”位,我发现TemplatedParent是一个ContentPresenter,而不是我期望的Button,这就解释了为什么Tag是空的。现在我当然可以编写一个ValueConverter来使用VisualTreeHelper.GetParent获取正确的值来获取ContentPresenter的父级(它将返回所需的Button),但是肯定必须有一种方法可以从XAML执行此操作?显然Path =“Parent.Tag”不起作用,因为ContentPresenter的Parent显然是Border。

有谁知道如何从XAML访问按钮的Tag属性?

回答

3

发现问题。原来你需要{RelativeSource Mode = Self},而不是{RelativeSource TemplatedParent}。

+0

感谢您的帮助.. :) –

相关问题