На самом деле вы можете.Хитрость заключается в том, чтобы создать Присоединенное свойство и добавить свойство, измененное обратным вызовом, которое фактически вызывает 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, мы можем применять преобразователи или что-либо еще, чтокак правило, мы можем это сделать, поэтому модели представления не нужно знать, что она фактически задает имя визуального состояния, State может быть как bool или enum или как угодно.
Вы также можете использовать этоПодход с использованием wpftoolkit на .net 3.5, но вы должны привести target
к Control
вместо FrameworkElement
.
Еще одно быстрое замечание о визуальных состояниях, убедитесь, что вы не называете свойвизуальные состояния, так что они конфликтуют со встроенными, если вы не знаете, что делаете.Это особенно верно для проверки, так как механизм проверки будет пытаться устанавливать свои состояния каждый раз, когда привязка обновляется (и в некоторых других случаях также). Перейдите сюда для ознакомления с именами визуальных состояний для различных элементов управления.