开发者

Visualstatemanager and databinding

C开发者_Go百科an I databind the state of the visual statemanager to my viewmodel?


No, but you can use an Expression Behavior that watches your ViewModel and changes states accordingly; check out http://blois.us/blog/2009_04_11_houseomirrors_archive.html


Another way of asigning Visual States by name, without any dependency on other classes:

  /// <summary>
  /// Sets VisualState on a control usign an attached dependency property.
  /// This is useful for a MVVM pattern when you don't want to use imperative
  /// code on the View.
  /// </summary>
  /// <example>
  /// &lt;TextBlock alloy:VisualStateSetter.VisualStateName=&quot;{Binding VisualStateName}&quot;/&gt;
  /// </example>
  public class VisualStateSetter : DependencyObject
  {

    /// <summary>
    /// Gets the name of the VisualState applied to an object.
    /// </summary>
    /// <param name="target">The object the VisualState is applied to.</param>
    /// <returns>The name of the VisualState.</returns>
    public static string GetVisualStateName( DependencyObject target )
    {
      return (string)target.GetValue( VisualStateNameProperty );
    }

    /// <summary>
    /// Sets the name of the VisualState applied to an object.
    /// </summary>
    /// <param name="target">The object the VisualState is applied to.</param>
    /// <param name="visualStateName">The name of the VisualState.</param>
    public static void SetVisualStateName( DependencyObject target, string visualStateName )
    {
      target.SetValue( VisualStateNameProperty, visualStateName );
    }

    /// <summary>
    /// Attached dependency property that sets the VisualState on any Control.
    /// </summary>
    public static readonly DependencyProperty VisualStateNameProperty =
      DependencyProperty.RegisterAttached(
      "VisualStateName",
      typeof( string ),
      typeof( VisualStateSetter ),
      new PropertyMetadata( VisualStateNameChanged ) );

    /// <summary>
    /// Callback for the event that the value of the VisualStateProperty changes.
    /// </summary>
    /// <param name="sender">The object the VisualState is applied to.</param>
    /// <param name="args">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
    public static void VisualStateNameChanged( object sender, DependencyPropertyChangedEventArgs args )
    {
      string visualStateName = (string)args.NewValue;
      Control control = sender as Control;
      if( control == null )
      {
        throw new InvalidOperationException( "This attached property only supports types derived from Control." );
      }
      // Apply the visual state.
      VisualStateManager.GoToState( control, visualStateName, true );
    }
  }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜