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 を使用しています。何が欠けていますか? この dll を取得するには、Expression Blend をインストールする必要がありますか?

また、仕事を終わらせる他の方法はありますか?(ViewModel のいくつかのプロパティでバインドすることにより、コントロールの VisualState を変更します)。

ご関心をお寄せいただきありがとうございます。

4

1 に答える 1

2

添付プロパティを使用して、要素のカスタム状態の変更を管理します。これらは、ビュー モデルにバインドされます。

たとえば、「分割画面」設定の場合、次のようにします。

モードと呼ばれるプロパティを使用して、SplitScreen と呼ばれるクラスに 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]
    }

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 をインストールする ことです。SDK とすべての優れた追加機能を利用するために Expression Blend は必要ありません。単純なアイテムの場合は作業が大幅に軽減されます (サポートされていないカスタム動作が必要だっただけです)。

于 2010-11-12T11:10:42.180 に答える