在我的窗口中,我有一系列的六个按钮,用于指示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属性?
感谢您的帮助.. :) –