Установка свойства тега кнопки в целочисленное значение и запуск триггера - PullRequest
1 голос
/ 16 сентября 2011

Я хочу сделать что-то вроде следующего, но это не работает. Я хочу использовать datatrigger, чтобы установить целочисленное значение (или любой другой тип) для свойства тега кнопки, которую я определяю внутри моей таблицы данных. И затем внутри стиля изображения кнопки запускается триггер, когда соответствующее значение устанавливается в свойство тега кнопки. Но, похоже, это не так. Если я установлю значение 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>

1 Ответ

2 голосов
/ 16 сентября 2011

Вы привязываетесь к 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));
        }
    }
}
...