2010-10-29 2 views
2

Учитывая приведенную ниже код:Изменение VisualState элемента управления путем связывания его с некоторым свойством ViewModel

xmlns:interactivity="clr-namespace:Microsoft.Expression.Interactivity;assembly=Microsoft.Expression.Interactivity" 

... 

<ToggleButton IsChecked="{Binding Path=IsGlobalControllerAttached}" Command="{Binding Path=AttachDetachGlobalControllerAction}" ToolTip="{Binding Path=GlobalControllerToolTip}" Visibility="{Binding Path=CanApplyDateFilter, Converter={StaticResource bool2VisibilityConverter}}" Style="{StaticResource toolBarToggleButton}"> 
       <i:Interaction.Behaviors> 
        <ei:DataStateBehavior Binding="{Binding IsGlobalControllerCreated}" Value="true" TrueState="Normal" FalseState="Disabled" /> 
       </i:Interaction.Behaviors> 
       <Image Source="../../Common/Images/pin.png"/> 
      </ToggleButton> 

Я пытаюсь установить VisualState из Кнопки переключения связывания его в какую-то собственность в ViewModel. Здесь я не могу найти файл Microsoft.Expression.Interactivity.dll в списке «Добавить ссылку». Я использую VS 2010. Что мне не хватает? Мне нужно установить Expression blend, чтобы получить эту DLL?

Также, Есть ли какой-либо другой способ выполнить работу? (Изменение VisualState элемента управления, предлагая его с некоторым свойством ViewModel).

Спасибо за ваш интерес.

ответ

2

Мы используем Attached Properties для управления пользовательскими изменениями состояния на элементах. Затем они просто привязаны к модели представления.

например. для настройки «split screen» мы делаем следующее.

Создать DependancyProperty в классе под названием Splitscreen, со свойством называется режим:

public class SplitScreen 
    { 
     public static readonly DependencyProperty ModeProperty = 
      DependencyProperty.Register("Mode", 
             typeof(SplitScreenMode), 
             typeof(UserControl), 
             new PropertyMetadata(SplitScreenMode.None, 
              new PropertyChangedCallback(OnScreenModeChanged))); 

     public static void SetMode(DependencyObject obj, SplitScreenMode value) 
     { 
      obj.SetValue(ModeProperty, value); 
     } 

     public static SplitScreenMode GetMode(Control obj) 
     { 
      return (SplitScreenMode)obj.GetValue(ModeProperty); 
     } 

     static void OnScreenModeChanged(object sender, DependencyPropertyChangedEventArgs args) 
     { 
      var control = sender as UserControl; 
      if (control != null) 
      { 
       if (control.Parent == null) 
       { 
        control.Loaded += (s, e) => 
              { 
               ApplyCurrentState(control); 
              }; 
       } 
       else 
       { 
        ApplyCurrentState(control); 
       } 
      } 
     } 
     [snip] 
    } 

Вы могли бы отметить нашу маленькую хитрость позднего обновления значение при Attached Property первоначально установлен (там часто не является родительским элементом, пока страница не будет полностью загружена).

В файле Xaml присоединить свойство к требуемому элементу, как это:

lib:SplitScreen.Mode="{Binding SplitScreenMode}" 

Ключа поймать зависимости изменения свойств и получить, чтобы изменить визуальное состояние присоединенного элемента (это отрезала часть файла SplitScreen.cs):

static public void ApplyCurrentState(Control control) 
{ 
    string targetState; 
    switch (GetMode(control)) 
    { 
     case SplitScreenMode.Single: 
      targetState = SplitScreenModeName.Single; 
      break; 
     case SplitScreenMode.Dual: 
      targetState = SplitScreenModeName.Dual; 
      break; 
     default: 
      targetState = SplitScreenModeName.None; 
      break; 
    } 
    VisualStateManager.GoToState(control, targetState, true); 
} 

альтернатива заключается в установке Expression Blend SDK Вам не нужна Expression Blend, чтобы использовать SDK и все классные дополнения. Это намного меньше для простых элементов (нам просто нужно какое-то индивидуальное поведение, которое оно не поддерживало).

+0

Спасибо, ваш ответ помог. –

+0

Может кто-нибудь указать на некоторую информацию о том, как это сделать на Blend? – javirs