2010-10-29 79 views
2

的一些属性绑定它考虑下面的代码更改控制的VisualState:通过视图模型

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。 在这里,我无法在“添加引用”列表中找到Microsoft.Expression.Interactivity.dll。我正在使用VS 2010. 我错过了什么?我需要安装Expression混合来获得这个DLL吗?

另外, 有没有其他的方式来完成工作? (通过使用ViewModel的某些属性来更改控件的VisualState)。

感谢您的关注。

回答

2

我们使用附加属性来管理元素上的自定义状态更改。这些只是绑定到视图模型。

例如对于“分屏”设置,我们执行以下操作。

在一个叫分屏类创建DependancyProperty,一个叫做模式属性:当连接时

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] 
    } 

您可能注意到我们的小动作后期更新值属性最初设置(有在页面被完全加载之前通常没有父元素)。

在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); 
} 

另一种方法是安装表达混合SDK 你不需要Expression Blend来使用SDK和所有酷炫的附加内容。简单项目的工作量要少很多(我们只需要一些它不支持的自定义行为)。

+0

谢谢,你的回答有帮助。 – 2010-11-18 10:46:53

+0

有人可以指出一些关于如何在Blend上做的信息? – javirs 2016-04-25 07:02:29