Сообщение об ошибке "Не удается анимировать" (0).(1) "на экземпляре неизменяемого объекта" для Button с RelayCommand

Я использую расширенную кнопку, управляемую двумя свойствами: IsLocked а также IsRequired,IsLocked отключает кнопку с помощью RelayCommand:

public class RelayCommand : ICommand
{
    private Action _execute;
    private Func<bool> _canExecute;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public RelayCommand(Action execute, Func<bool> canExecute = null)
    {
        this._execute = execute;
        this._canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return this._canExecute == null || this._canExecute();
    }

    public void Execute(object parameter)
    {
        this._execute();
    }
}

IsRequired меняет цвет фона кнопки с анимацией.

Оба свойства являются зависимыми и определены как:

public Boolean IsRequired
    {
        get { return _isRequired; }
        private set
        {
            if (_isRequired == value)
                return;

            _isRequired = value;

            if (_isRequired)
                this.IsLocked = false;

            NotifyPropertyChanged();
        }
    }

public Boolean IsLocked
    {
        get { return _isLocked; }
        private set
        {
            if (_isLocked == value)
                return;

            _isLocked = value;                

            if (_isLocked)
                this.IsRequired = false;

            NotifyPropertyChanged();
        }
    }

Я управляю кнопкой через свойства в модели представления и привязку к свойствам кнопки в связанном представлении:

IsLocked="{Binding IsLocked}"
IsRequired="{Binding IsRequired}"

У меня появляется сообщение об ошибке "Не удается анимировать" (0).(1) "на экземпляре неизменяемого объекта" при установке IsRequired Правда в моей точке зрения модели. Обычно, IsLocked ложно (через Setter свойства), но я вижу, что свойство IsEnabled все еще ложно. Итак, я попытался изменить IsEnabled в PropertyChangedCallback связан со свойством зависимости моей расширенной кнопки. Но это невозможно, это заморожено.

Это работает, если я не использую CanExecute метод RelayCommand больше, и если я связываю собственность IsEnabled моей расширенной кнопки непосредственно в собственность IsLocked,

Любой способ продолжить использовать команду реле?

РЕДАКТИРОВАТЬ: Это стиль моей расширенной кнопки

<Button x:Class="Client.UserControls.ExtendedButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:Client.UserControls"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300">
<Button.Style>
    <Style TargetType="{x:Type local:ExtendedButton}" BasedOn="{StaticResource {x:Type Button}}">
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsEnabled" Value="True"/>
                    <Condition Property="IsRequired" Value="True"/>
                </MultiTrigger.Conditions>
                <MultiTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard BeginTime="00:00:00"
                                RepeatBehavior="Forever"
                                Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)">
                            <ColorAnimation To="Orange" Duration="0:0:1" AutoReverse="True"/>
                        </Storyboard>
                    </BeginStoryboard>
                </MultiTrigger.EnterActions>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

Стиль стандартной кнопки определен в другом проекте под названием Тема с:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Theme">

<Style TargetType="{x:Type Button}">
    <Style.Resources>
        <ResourceDictionary Source="ColorConstants.xaml"/>
    </Style.Resources>
    <Setter Property="Background" Value="{StaticResource DefaultBackgroundSolidColor}"/>
    <Setter Property="BorderBrush" Value="White"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Height" Value="70"/>
    <Setter Property="Margin" Value="1"/>
    <Setter Property="Padding" Value="5"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}"                           
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="2"
                        Margin="{TemplateBinding Margin}">
                    <TextBlock Foreground="{TemplateBinding Foreground}"
                               HorizontalAlignment="Center"
                               Margin="{TemplateBinding Padding}"
                               VerticalAlignment="Center">
                        <ContentPresenter/>
                    </TextBlock>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="True">
                        <Setter Property="Background" Value="{StaticResource IsEnabledBackgroundSolidColor}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

0 ответов

Вероятно, это связано с тем, что вы не установили значение для исходной кисти фона в стиле с раскадровкой:

<Style TargetType="{x:Type local:ExtendedButton}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Background" Value="{StaticResource DefaultBackgroundSolidColor}"/>
    <Style.Triggers>
        <MultiTrigger>
             ...
Другие вопросы по тегам