2

考虑下面的代码:

 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>

我正在尝试通过将其绑定到 ViewModel 中的某个属性来设置切换按钮的 VisualState。在这里,我无法在“添加引用”列表中找到 Microsoft.Expression.Interactivity.dll。我正在使用 VS 2010。我错过了什么?我需要安装 Expression blend 来获取这个 dll 吗?

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

感谢您的关注。

4

1 回答 1

2

我们使用附加属性来管理元素的自定义状态更改。然后将它们绑定到视图模型。

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

在名为 SplitScreen 的类中创建一个 DependancyProperty,并带有一个名为 Mode 的属性:

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

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

于 2010-11-12T11:10:42.180 回答