3

いくつかの MVVM ツールキット (MVVM Light、SimpleMVVM) を見た後、共通のテーマは、コードビハインドを使用せずに、できるだけ多くのブレンド可能なイベントを使用しようとしているようです。

すべてのイベントを行う方法がわかりません。たとえば、windows phone 7 を実行すると、2 つのイベントがバインドされます。

  1. OnNavigatedTo/From
  2. ロード中

MVVMでこれを行う方法の例はありますか? 私はSimpleMVVMを使用していますが、例が似ていて、MVVMライトツールキットや、これを示す一般的なMVVMチュートリアルが役立つことを願っています.

ボタンのクリックのようにする方法を示すものしか見つかりませんでした。

編集

コード ビハインド イベントをいつ使用するか、ブレンド イベントをコマンドに使用するかについて、私はちょっと混乱しています。

たとえば、MVVM Light チュートリアルでは、ナビゲーションに MVVM を使用していますが、分離コード イベントを使用するよりも優れているのはなぜですか?

人々が言うとき、私も今ちょっと混乱しています

コードビハインドは悪ではありません。ビジネス ロジックとコード ビハインドの組み合わせが問題です。UI がコード ビハインドで UI タスクを処理できるようにします。

MVVMライトの例では、例の1つに「isbusy」があり、リストまたはそれが何であれ(忘れた)ロード中に「ロードサインが表示されます」。これはすべて、コード ビハインド イベントではなく、ViewModel で行われました。

だから、これは私にはちょっと矛盾しているようです(何かが足りないかもしれません)。また、私が困惑しているのは、ViewModel が読み込みについて何も知らない場合、読み込みがいつ開始または終了したかをどのように知ることができるかということです。

4

2 に答える 2

2

HighCore がコメントしたように、を使用しますEventToCommand。最初に Blend SDK が必要ですが、使い方はとても簡単です。

...
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.SL4"
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
...
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
            <cmd:EventToCommand Command="{Binding GetTweetsCommand}" CommandParameter="Twitter" />
        </i:EventTrigger>
</i:Interaction.Triggers>

また、コード ビハインドに関する一般的なポイント: UI 関連の機能をコード ビハインドに含めることは、世界で最悪のことではありません。これは ViewModel とは別のものであり、論理的な場所にあります。ただし、動作をテストする方が簡単だと思います。たとえば、から継承するクラスを使用するTargetedTriggerActionと、ストーリーボードをプロパティの変更とコントロールの両方で制御できます。

public class ImageAnimationTrigger : TargetedTriggerAction<Storyboard>
{
    protected override void Invoke(object parameter)
    {
        if (Target == null)
            return;

        if (parameter is DependencyPropertyChangedEventArgs)
        {
            DependencyPropertyChangedEventArgs args = (DependencyPropertyChangedEventArgs)parameter;

            if ((bool)args.NewValue)
                Target.Begin();
            else
                Target.Stop();
        }
        else if (parameter is RoutedEventArgs)
        {
            RoutedEventArgs args = (RoutedEventArgs)parameter;

            if (!(args.OriginalSource as Button).IsEnabled)
                Target.Begin();
            else
                Target.Stop();
        }
    }
}

この動作をPropertyChangedTrigger次のように使用します。

<i:Interaction.Triggers>
    <ic:PropertyChangedTrigger Binding="{Binding Loading}">
        <behav:ImageAnimationTrigger TargetName="animStoryboard" />
    </ic:PropertyChangedTrigger>
</i:Interaction.Triggers>

Laurent Bugnion が言うように、必要に応じてコード ビハインドを使用してください。

于 2013-02-18T19:34:19.280 に答える
0

1) 残念ながら、良い例が見つからなかったので、自己責任でお願いします。

2) (ボタン クリックの代わりにコマンドを使用して) コード ビハインドを空白のままにしておくと、ViewModel のみにコードが集中します。2 つの利点があります。

a) 異なるビューに対して 1 つの ViewModel を使用する場合 (およびいくつかのビューでいくつかの共通コマンドを使用する場合)、

b) View では使用できない ViewModel のプライベート変数/メソッドを使用する場合。

3) RaisePropertyChanged を使用してデータをロード (リロード) し、ViewModel コンストラクターにデータをロードして、OnNavigatedTo などの使用を避けることができます。

于 2013-04-02T14:58:40.507 に答える