C# DataStateBehavior-未触发的状态?

C# DataStateBehavior-未触发的状态?,c#,wpf,mvvm,C#,Wpf,Mvvm,在视图模型中具有此逻辑: private void ExecuteTestConnectionCommand() { _IsBusy = true; _connectionTester.CanConnect(_currentConnectionString); _IsBusy = false; } public const string IsBusyPropertyName = "IsBusy"; private bool _IsBusy = false;

在视图模型中具有此逻辑:

private void ExecuteTestConnectionCommand()
{
    _IsBusy = true;
    _connectionTester.CanConnect(_currentConnectionString);
    _IsBusy = false;
}

public const string IsBusyPropertyName = "IsBusy";    
private bool _IsBusy = false;    
public bool IsBusy
{
    get
    {
        return _IsBusy;
    }

    set
    {
        if (_IsBusy == value)
        {
            return;
        }

        RaisePropertyChanging(IsBusyPropertyName);
        _IsBusy = value;
        RaisePropertyChanged(IsBusyPropertyName);
    }
}
CanConnect具有阻塞操作。

想在测试连接按钮上做一些动画以获得乐趣。当IsBusy=true时,希望按钮进行淡入淡出(或至少某种动画)

到目前为止,我已经:

<Button x:Name="buttonTest" Command="{Binding TestConnectionCommand}" Content="Test">
    <i:Interaction.Behaviors>
        <ei:DataStateBehavior Binding="{Binding IsBusy}" 
            Value="True" TrueState="BusyState" FalseState="NotBusyState"/>
    </i:Interaction.Behaviors>
</Button>

并指出:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="VisualStateGroup">
        <VisualStateGroup.Transitions>
            <VisualTransition GeneratedDuration="0:0:3" To="BusyState">
                <VisualTransition.GeneratedEasingFunction>
                    <CircleEase EasingMode="EaseOut"/>
                </VisualTransition.GeneratedEasingFunction>
            </VisualTransition>
            <VisualTransition GeneratedDuration="0:0:4" To="NotBusyState">
                <VisualTransition.GeneratedEasingFunction>
                    <BounceEase EasingMode="EaseInOut"/>
                </VisualTransition.GeneratedEasingFunction>
            </VisualTransition>
            <VisualTransition GeneratedDuration="0:0:2">
                <VisualTransition.GeneratedEasingFunction>
                    <BounceEase EasingMode="EaseIn"/>
                </VisualTransition.GeneratedEasingFunction>
            </VisualTransition>
        </VisualStateGroup.Transitions>
        <VisualState x:Name="BusyState">
            <Storyboard AutoReverse="True" RepeatBehavior="Forever"/>
        </VisualState>
        <VisualState x:Name="NotBusyState"/>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>


当我点击测试按钮时,据我所知没有动画发生。为什么?

不确定,因为这可能是完全关闭的,但是您的财产“IsBusy”没有通过查看私人等价物“IsBusy”来捕获吗?您的模型似乎遵循MVVM结构,即拥有私有属性,然后按照以下模式进行设置:

private string _Thing;

Public string Thing
{
    get { return _Thing; }
    set { _Thing = value; }
   RaisePropertyChanged("Thing")
}
传统上,大多数情况下,通过继承“INotifyPropertyChanged”接口并实现与此类似的逻辑,在基本viewmodel中实现Raise属性:

public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
{
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
通常,您传入属性的字符串名称,然后系统知道将更改公开给它以查看


我知道在我用MVVM做事的情况下,有些东西没有被提出,通常我需要有效地实现“RaisePropertyChanged”,或者在XAML进行更改时尝试调用公共属性检查而不是私有属性检查

嗯,我试过你说的,还把整个房子都贴了出来。仍然没有发生任何事情。除非您正在实现我还没有看到的方法,否则您正在执行RaisePropertyChanged的实现是错误的。通常,将属性的字符串“name”放在双引号中,它使用反射来引发属性通知。更新了我的答案以作进一步解释。您的常量字符串在进一步查看时可能还可以。我将尝试在您的“set”操作下设置断点,并确保对视图的更改实际上是有效的。