2013-07-26 59 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

感謝您的幫助.. :) –

相關問題