Вы привязываетесь к DataContext
из Image
, а не к шаблонному Button
Привязка к TemplatedParent
.
Что касается примечания, нет необходимости использовать два DataTriggers
для true и false. Сделайте это вместо
<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));
}
}
}