如何更改WPF中的buttonstyle,由布尔值触发?

时间:2011-08-29 19:37:31

标签: c# wpf xaml

我需要一个按钮,每当布尔值(IsFavourite)发生变化时,它会改变他的Backgroundimage。 我尝试使用DataTrigger,但他不知道属性:“Source”。你能帮我吗,我不是那个xaml-code :-(

<Style x:Key="starButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Image x:Name="PART_img" Source="/FtpUploadClient;component/media/star_off_48.png" Height="28" Width="28" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="PART_img"
                        Property="Source"
                        Value="/FtpUploadClient;component/media/star_48.png" />
                    </Trigger>
                    <DataTrigger Binding="{Binding Path=IsFavourite}" Value="True">
                        <Setter Property="Source" Value="/FtpUploadClient;component/media/star_48.png" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=IsFavourite}" Value="False">
                        <Setter Property="Source" Value="/FtpUploadClient;component/media/star_off_48.png" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

private void StarButton_Click(object sender, RoutedEventArgs e)
{
    IsFavourite = !IsFavourite;
}

private bool isFavourite = false;
public bool IsFavourite
{
    get { return isFavourite; }
    set
    {
        isFavourite = value;
        OnPropertyChanged("IsFavourite");
    }
}


public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

- 按钮事件Click调用一个更改IsFavourite的方法:

<Button Content="Star" Style="{DynamicResource starButtonStyle}" Click="StarButton_Click" />

4 个答案:

答案 0 :(得分:5)

将触发器添加到图像样式而不是ControlTemplate

<Image HorizontalAlignment="Center" VerticalAlignment="Center" Height="28" Width="28">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Source" Value="/FtpUploadClient;component/media/star_off_48.png" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Source" Value="/FtpUploadClient;component/media/star_48.png" />
                </Trigger>
                <DataTrigger Binding="{Binding Path=IsFavourite}" Value="True">
                    <Setter Property="Source" Value="/FtpUploadClient;component/media/star_48.png" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

答案 1 :(得分:0)

1)你的datacontext是否实现了INotifyPropertyChanged,并且在setter上引发了PropertyChanged("IsFavourite")?这将确保在该属性更改时通知您的视图。

2)尝试放"Image.Source"而不是"Source"

3)尝试在setter上使用TargetName="PART_img"

答案 2 :(得分:0)

Button没有Source属性。

您试图通过将Source添加到Image来设置TargetName="PART_img"的{​​{1}}。

答案 3 :(得分:0)

解决了它: 使用Rachels XAML和构造函数中的属性this.DataContext = Classname;,它可以工作: - )