我可以将visual statemanager的状态数据绑定到我的viewmodel吗?
答案 0 :(得分:4)
不,但您可以使用表达行为来监视ViewModel并相应地更改状态;看看http://blois.us/blog/2009_04_11_houseomirrors_archive.html
答案 1 :(得分:1)
按名称分配视觉状态的另一种方式,不依赖于其他类:
/// <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>
/// <TextBlock alloy:VisualStateSetter.VisualStateName="{Binding VisualStateName}"/>
/// </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 );
}
}