微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wpf – 绑定[VisualStateManager]视图状态到MVVM viewmodel?

如何将控件的visualstatemanager状态绑定到viewmodel中的属性
可以做吗?

解决方法

其实你可以。
诀窍是使一个Attached属性添加一个属性更改的回调实际上调用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>

名称和状态是视图模型中的常规属性。当在viewmodel中设置Name时,通过绑定或其他方式,它可以更改状态,将更新可视状态。状态也可以由任何其他因素设置,并且仍然会更新文本框上的视图状态。

因为我们使用一个普通的绑定绑定到状态,我们可以应用转换器或任何我们通常能够做的事情,所以viewmodel不必知道它实际设置一个可视状态名称State可以是bool或枚举或任何。

你也可以使用这种方法在.net 3.5上使用wpftoolkit,但是你必须将目标转换为一个Control而不是FrameworkElement。

一个关于视觉状态的快速注释,确保你不要命名你的视觉状态,以便它们与内置的冲突,除非你知道你在做什么。这对于验证尤其如此,因为验证引擎将在每次绑定被更新时尝试和设置其状态(以及在某些其它时间)。 Go here用于不同控件的视觉状态名称的参考。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐