其实你可以。
诀窍是制作一个附加属性并添加一个实际调用GoToState的属性更改回调:
public class StateHelper {
public static readonly DependencyProperty StateProperty = DependencyProperty.RegisterAttached(
"State",
typeof( String ),
typeof( StateHelper ),
new UIPropertyMetadata( null, StateChanged ) );
internal static void StateChanged( DependencyObject target, DependencyPropertyChangedEventArgs args ) {
if( args.NewValue != null )
VisualStateManager.GoToState( ( FrameworkElement )target, args.NewValue, true );
}
}
然后,您可以在 xaml 中设置此属性,并像其他任何方法一样将绑定添加到您的视图模型:
<Window .. xmlns:local="clr-namespace:mynamespace" ..>
<TextBox Text="{Binding Path=Name, Mode=TwoWay}"
local:StateHelper.State="{Binding Path=State, Mode=TwoWay}" />
</Window>
Name 和 State 是视图模型中的常规属性。在视图模型中设置Name 时,无论是通过绑定还是其他方式,它都可以更改State 女巫将更新视觉状态。 State 也可以由任何其他因素设置,它仍然会更新文本框上的视图状态。
由于我们使用普通绑定来绑定到 Status,我们可以应用转换器或我们通常能够执行的任何其他操作,因此 viewmodel 不必知道它实际上设置了视觉状态name, State 可以是 bool 或 enum 或其他。
您也可以使用 .net 3.5 上的 wpftoolkit 使用此方法,但您必须将 target 转换为 Control 而不是 FrameworkElement。
另一个关于视觉状态的快速说明,请确保不要命名视觉状态,以免它们与内置状态冲突,除非您知道自己在做什么。这对于验证尤其如此,因为验证引擎将尝试设置其状态每次绑定更新(以及在其他一些时间)。 Go here 参考不同控件的视觉状态名称。