4

この質問は多くの人に似ています。とにかく、私は理解していません。

私はいくつかのVisualStatesを持っています(2つ以上、それがDataStateBehaviorが私の解決策ではない理由です)。そして、列挙型プロパティCurrentStateを持つ ViewModel があります。すべての列挙値は 1 つの状態を表します。また、複数の列挙値が 1 つの状態を表す場合もありますが、これは当てはまりません。CurrentStateが変更されたときにVisualStateを変更したい(思った、すぐに頭に浮かぶ: Binding はこのケースのために正確に作成されました! )

上記の動作を取得するために、CurrentStateをビューVisualState (xaml のみのソリューション)にバインドできますか?

はいの場合、どうすればできますか?

いいえの場合、 ViewModelでVisualStateManager.GoToState()メソッドをどのように使用すればよいですか?

4

2 に答える 2

9

Blend SDK の組み込みコンポーネントを使用して、@FasterSolutions に似たソリューションに注目したいと思います。

PropertyChangedTriggerビューモデルの "CurrentState" プロパティにa を設定し、 a を追加して表示GoToStateAction状態を変更します。

<i:Interaction.Triggers
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Inte‌​ractivity"  
    xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microso‌ft.Expression.Interactions">
    <ei:PropertyChangedTrigger Binding="{Binding CurrentState}">
        <ei:GoToStateAction StateName="{Binding CurrentState}" />
    </ei:PropertyChangedTrigger>
</i:Interaction.Triggers>
于 2013-08-17T00:52:46.367 に答える
8

いくつかの理由から、ViewModel で VisualStateManager.GoToState を使用しません。最大の理由は、視覚状態を変更するコントロールを渡す必要があることです。UI コントロールをビューモデルに渡すことは、MVVM アプローチ全体に反します。

私の提案は、(Windows 8 ストアの場合) Winrt Behaviorsを使用するか、Blend system.windows.interactivity.dll (同じ機能の場合) を使用して、ビューモデルから VisualState 名を取得し、オブジェクトを更新することです。コードは次のようになります。

ビューモデル:

public string State{
    get{_stateName;}
    set{_stateName=value;
        RaisePropertyChanged("State");
}

意見:

<Grid>
    <I:Interaction.Behaviors>
        <b:VisualStateSettingBehavior StateToSet="{Binding State}"/>
    </i:Interaction.Behaviors>
</Grid>

行動:

public class VisualStateSettingBehavior:Behavior<Control>
{

    StateToSet{
               get{GetValue(StateProperty) as string;}
               set{SetValue{StateProperty,value);
                    LoadState();}
}
private void LoadState()
{
VisualStateManager.GoToState(AssociatedObject,StateToSet,true);
}
}

ビヘイビアーが行っていることは、コントロールに接続し、プログラムによる方法でその機能を拡張できるようにすることです。このアプローチにより、ViewModel を View から分離しておくことができます。

于 2012-10-10T09:23:44.293 に答える