将按钮的标签属性设置为整数值并触发触发器

发布于 2024-12-05 03:08:50 字数 1541 浏览 1 评论 0原文

我想做类似以下的事情,但它不起作用。我想使用数据触发器将整数(或任何类型)值设置为我在数据模板中定义的按钮的标签属性。然后,当相应的值设置为按钮的 tag 属性时,在按钮的图像样式内触发触发器。但它似乎并不是这样工作的。如果我设置 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>

I want to do something like the following but it doesn't work. I want to use a datatrigger to set an integer (or whatever type) value to the Tag Property of a button i define inside my datatemplate. And then inside the button's image style fire a trigger when the corresponding value is set to the tag property of the button. But it doesn't seem to be working this way. If i set an x:Null value i can fire the trigger, that means the logic is ok. But setting a value like 0 or 1 doesn't fire the trigger. Any solutions?

<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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

各自安好 2024-12-12 03:08:50

您将绑定到 ImageDataContext,而不是绑定到模板化 Button

而是绑定到 TemplatedParent

附带说明一下,不需要使用两个 DataTriggers 来表示 true 和 false。执行此操作

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

并仅保留 DataTriggers Example 之一

<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));
        }
    }
}

You are binding to the DataContext of the Image and not to the templated Button

Bind to the TemplatedParent instead.

On a side note, there is no need to use two DataTriggers for true and false. Do this instead

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

And only keep one of the DataTriggers

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

Example, add the following to 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));
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文