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”操作下设置断点,并确保对视图的更改实际上是有效的。