Как изменить стиль кнопки в WPF, вызванный логическим значением? - PullRequest
1 голос
/ 29 августа 2011

Мне нужна кнопка, которая меняет свой Backgroundimage каждый раз, когда меняется логическое значение (IsFavourite).Я пробовал это с DataTrigger, но он не знает свойство: «Источник».Можете ли вы помочь мне, я не то, чтобы в xaml-код :-(

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

5 голосов
/ 30 августа 2011

Добавьте свой триггер в свой стиль изображения вместо 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>
0 голосов
/ 30 августа 2011

Решено: с помощью Rachels XAML и свойством: this.DataContext = Classname; в конструкторе это работает: -)

0 голосов
/ 29 августа 2011

Button не имеет свойства Source.

Вы пытаетесь установить Source из Image, добавив TargetName="PART_img" к Setter.

0 голосов
/ 29 августа 2011

1) Реализует ли ваш datacontext INotifyPropertyChanged, и PropertyChanged("IsFavourite") поднят на сеттер?Это гарантирует, что ваше представление получит уведомление при изменении этого свойства.

2) попробуйте поставить "Image.Source" вместо просто "Source"

3) Попробуйте использовать TargetName="PART_img" на сеттере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...