在我的窗口中,我有一系列的六個按鈕,用於指示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屬性?
感謝您的幫助.. :) –