1

画面全体に 2 桁の数字を含むラベルをアニメーション化し、ユーザーに各数字に対応するニーモニックをすばやく入力するように求めることで、MVVM パターンを使用してこの主要なメモリ トレーナーを作成しています。アニメーションがどのように行われるかは完全にビュー次第なので、これにはいくつかのコード ビハインドがあります。正しいニーモニックが UI に入力されるか、数字が画面から消えると、ビューからコマンドが実行され、これが発生したことが中継されます。

ViewModel では、View がアニメーション化する新しい数値を定期的に発射したいと考えています (必要に応じて)。

これを達成する最善の方法は何ですか?ViewModel で ObservableCollection<> を使用できますが、単純にバインドするだけでなく、数値が追加および削除されたときにコード ビハインドでメソッドを実行する必要があります。

ViewModel で単純な .NET イベントを使用し、DataContext.NumberAdded += new NumberAddedEventHandler(....) でサブスクライブするのは MVVM に従っていますか、それとも別の方法がありますか?

4

3 に答える 3

2

View は、ViewModel のユーザー フレンドリーな反映となることを目的としています。実行するビュー固有のロジック (アニメーションのトリガーなど) がある場合、コード ビハインドを使用しない理由はありません。

UI レイヤーとデータ レイヤーを分けておけば問題ありません。

とはいえ、View レイヤーからのみ使用している場合、ViewModel からイベントを提供することNumberAddedはあまり意味がありません。それはあなたのレイヤーを混同しています。

代わりに、単に通常のCollectionChanged

((MyViewModel)this.DataContext).Numbers.CollectionChanged += 
    new CollectionChangedEventHandler(....);

コレクションが UI にどのようにバインドされているかによっては、代わりに UI イベントまたはトリガーを使用できる場合もあります。

ItemsSourceアイテムが追加または削除されたときに発生するイベントを持つ要素を考えました。または、単にプロパティをコレクションにキャストし、参照する必要なくそこでイベントにItemsSourceフックすることもできますCollectionChangedMyViewModel

void SomeItemsControl_DataContextChanged(...)
{
    var collection = (SomeItemsControl.ItemsSource as ObservableCollection);
    if (collection != null)
        collection.CollectionChanged += new CollectionChangedEventHandler(....);
}
于 2013-04-30T12:57:22.703 に答える
1

束縛が悪いと思うのはなぜですか?

私はおそらくObservableCollection<T>ビューからにバインドします。

DependencyPropertyビュー内にを作成ObservableCollection<T>し、PropertyChanged コールバックでイベントをサブスクライブします。これにより、ビュー内のOnCollectionChangedの内容に基づいてアニメーションを適切に処理できます。ObservableCollection<T>

このようにして、VM はあなたが言及したこれらの番号でコレクションを更新するだけで、ビューは、コレクションが適切な方法で変更されるたびにアクションに接続されます。

于 2013-04-30T12:57:00.503 に答える
0

アタッチされた動作を使用して、viewmodel プロパティを必要なカスタム動作にバインドします。

于 2013-04-30T12:59:27.890 に答える