Если вы хотите придерживаться обязательного подхода, ваш единственный реальный выбор - Смешанное поведение . Однако, поскольку Silverlight 3 (и, следовательно, WP7) не поддерживает свойства поведения с привязкой к данным, ваш путь намного сложнее. Да, это PITA, и да, я надеюсь, что они объявят о возможностях SL4 на MIX на следующей неделе.
Ниже приведено поведение WPF , которое делает то же самое, чтобы дать вам представление о том, что требуется от поведения, но оно не будет работать в Silverlight 3 / WP7 из-за к вышеуказанной проблеме. Вам нужно изменить свойство State
на тип Binding
и пройти сложный процесс получения доступа к этому значению привязки. Примеры того, как это сделать, вы можете найти в TailSpin.PhoneClient.Infrastructure.ButtonCommand
источника Patterns & Practices WP7 Dev Guide *1013* или из EventToCommand MVVM Light .
public class StateManagementBehavior : Behavior<FrameworkElement>
{
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(string),
typeof(StateManagementBehavior),
new UIPropertyMetadata(null, PropertyChangedCallback));
public static readonly DependencyProperty UseTransitionsProperty =
DependencyProperty.Register("UseTransitions", typeof(bool),
typeof(StateManagementBehavior),
new UIPropertyMetadata(true));
public static void PropertyChangedCallback(
DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var stateManagementBehavior = (StateManagementBehavior)d;
stateManagementBehavior.GoToState();
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += (s, e) => GoToState();
}
private void GoToState()
{
if (AssociatedObject == null || State == null) return;
VisualStateManager.GoToState(AssociatedObject, State, UseTransitions);
}
public string State
{
get { return (string)GetValue(StateProperty); }
set { SetValue(StateProperty, value); }
}
public bool UseTransitions
{
get { return (bool)GetValue(UseTransitionsProperty); }
set { SetValue(UseTransitionsProperty, value); }
}
}
Предполагая, что все это работает, вы будете использовать такое поведение:
<DataTemplate x:Key="MessageItemTemplate">
<Grid MinWidth="200" MinHeight="90" Width="460" Margin="0,2">
<i:Interactivity.Behaviors>
<infrastructure:StateManagementBehavior State="{Binding CurrentState}"
UseTransitions="True" />
</i:Interactivity.Behaviors>
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>
...
</Grid>
</DataTemplate>