2011-09-16 22 views
1

我想要做類似下面的事情,但它不起作用。我想使用一個數據觸發器來設置一個整數(或任何類型)值到我在我的數據模板中定義的按鈕的標籤屬性。然後在按鈕的圖像樣式中,當相應的值設置爲按鈕的標籤屬性時觸發一個觸發器。但它似乎並沒有這樣工作。如果我設置了x:Null值,我可以觸發該觸發器,這意味着邏輯正常。但是設置一個值如0或1不會觸發觸發器。任何解決方案將一個按鈕的標籤屬性設置爲一個整數值並觸發一個觸發器

<DataTemplate x:Key="SomeDataTemplateofSomeType"> 

<Button x:Name="ButtonVisible"> 
    <Button.Template> 
     <ControlTemplate TargetType="Button"> 
      <Image x:Name="FxImage"> 
        <Image.Style> 
         <Style TargetType="{x:Type Image}"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Value="0"> 
           <Setter Property="Source" Value="/Resources/controls/images/fxiconsnone.png" /> 
          </DataTrigger> 
         </Style.Triggers> 
         </Style> 
       </Image.Style> 
      </Image> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

<DataTemplate.Triggers> 
<DataTrigger Binding="{Binding Path=IsVisible, Value="True"> 
    <Setter Property="Tag" TargetName="ButtonVisible" Value="1" /> 
</DataTrigger> 

<DataTrigger Binding="{Binding Path=IsVisible, Value="False"> 
    <Setter Property="Tag" TargetName="ButtonVisible" Value="0" /> 
</DataTrigger> 
</DataTemplate.Triggers> 
</Datatemplate> 

回答

2

您綁定到ImageDataContext,而不是到模板Button

綁定到TemplatedParent代替。

在旁註中,沒有必要使用兩個DataTriggers來表示真和假。做到這一點,而不是

<Button x:Name="ButtonVisible" Tag="1"> 

只保留了DataTriggers

<DataTrigger Binding="{Binding Path=IsVisible}" Value="False"> 
    <Setter Property="Tag" TargetName="ButtonVisible" Value="0" /> 
</DataTrigger> 

之一,添加以下MainWindow.xaml

<StackPanel> 
    <StackPanel.Resources> 
     <DataTemplate x:Key="SomeDataTemplateofSomeType"> 
      <Button x:Name="ButtonVisible"> 
       <Button.Template> 
        <ControlTemplate TargetType="Button"> 
         <Image x:Name="FxImage"> 
          <Image.Style> 
           <Style TargetType="{x:Type Image}"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Value="0"> 
              <Setter Property="Source" Value="YourImageSource" /> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </Image.Style> 
         </Image> 
        </ControlTemplate> 
       </Button.Template> 
      </Button> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Path=IsVisible}" Value="True"> 
        <Setter Property="Tag" TargetName="ButtonVisible" Value="1" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=IsVisible}" Value="False"> 
        <Setter Property="Tag" TargetName="ButtonVisible" Value="0" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </StackPanel.Resources> 
    <ContentControl Content="{Binding MySource}" 
        ContentTemplate="{StaticResource SomeDataTemplateofSomeType}"/> 
    <ToggleButton IsChecked="{Binding Path=MySource.IsVisible, Mode=TwoWay}" Content="IsChecked?"/> 
</StackPanel> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MySource = new MySource(); 

     this.DataContext = this; 
    } 
    public MySource MySource 
    { 
     get; 
     set; 
    } 
} 
public class MySource : INotifyPropertyChanged 
{ 
    private bool m_isVisible; 
    public bool IsVisible 
    { 
     get { return m_isVisible; } 
     set 
     { 
      m_isVisible = value; 
      OnPropertyChanged("IsVisible"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

對不起,我錯過了我的複製粘貼代碼。我的代碼已經是這樣了,我會編輯第一篇文章,以避免任何誤解。儘管如此,它仍然行不通,所以你知道我該怎麼做嗎? :( – muku

+0

@muku:好的,我把你的代碼複製到了我自己的測試項目中,它的工作原理是這樣的,其他的一切都是這個問題,我會檢查你的更新 –

+0

你確定?因爲我告訴你,如果我將setter值更改爲0或1,則觸發器不會被觸發,而且在setter中我還設置了另一個值,一個textblock文本以知道setter是被解僱了... – muku

相關問題