4

MVVM の質問です。ViewModel と View の間のメッセージング、どのように実装するのが最適ですか?

アプリケーションには、次のような「ユーザー通信」のポイントがいくつかあります。はい/いいえ/NA の選択の値が変化すると、保存しますか、それとも破棄しますか」というメッセージが表示されます。したがって、ビューをビューモデルの「メッセージ」にバインドするための禁止された方法が必要です。

私は MVVM Foundation の Messenger から始めて道をたどりました。ただし、これはイベント/サブスクライバー モデルよりもシステム全体のブロードキャストに近いものです。そのため、アプリにビューの 2 つのインスタンス (Person1 EditView と Person2 EditView) が開いている場合、1 つの ViewModel が「保存しますか」というメッセージを発行すると、両方のインスタンスがメッセージを受け取ります。

どのようなアプローチを使用しましたか?

ありがとうアンディ

4

2 に答える 2

5

これらすべてについて、「コミュニケーション」の方法としてバインディングを使用します。たとえば、確認メッセージは、ViewModel で設定されたプロパティに基づいて表示または非表示になる場合があります。

ビューはこちら

<Window.Resources>
     <BoolToVisibilityConverter x:key="boolToVis" />
</Window.Resources>
<Grid>

<TextBox Text="{Binding Comment, Mode=TwoWay}" />
<TextBlock Visibility="{Binding IsCommentConfirmationShown, 
                        Converter={StaticResource boolToVis}" 
           Text="Are you sure you want to cancel?" />

<Button Command="CancelCommand" Text="{Binding CancelButtonText}" />
</Grid>

そして、ここにあなたのViewModelがあります

// for some base ViewModel you've created that implements INotifyPropertyChanged
public MyViewModel : ViewModel 
{
     //All props trigger property changed notification
     //I've ommited the code for doing so for brevity
     public string Comment { ... }
     public string CancelButtonText { ... }
     public bool IsCommentConfirmationShown { ... }
     public RelayCommand CancelCommand { ... }


     public MyViewModel()
     {
          CancelButtonText = "Cancel";
          IsCommentConfirmationShown = false;
          CancelCommand = new RelayCommand(Cancel);
     }

     public void Cancel()
     {
          if(Comment != null && !IsCommentConfirmationShown)
          {
               IsCommentConfirmationShown = true;
               CancelButtonText = "Yes";
          }
          else
          {
               //perform cancel
          }
     }
}

これは完全なサンプルではありません (唯一のオプションは yes! :) ) ですが、うまくいけば、これは View と ViewModel がほぼ 1 つのエンティティであり、互いに電話をかけている 2 つのエンティティではないことを示しています。

お役に立てれば。

于 2009-12-30T18:18:52.687 に答える
2

アンダーソンが説明していることは、あなたが説明した特定の要件にはおそらく十分です。ただし、ビュー モデルとビューの間の対話を強力にサポートするExpression Blend Behaviorsを調べることをお勧めします。これは、より複雑なシナリオで役立つ可能性があります。「メッセージ」のバインディングを使用しても、これまでのところしか得られません。

Expression Blend SDK は自由に利用できることに注意してください。SDK や動作を使用するために Expression Blend を使用する必要はありません。ただし、Blend IDE には、動作の「ドラッグ アンド ドロップ」に対するサポートが組み込まれています。

また、各「動作」はコンポーネントであることに注意してください。つまり、拡張可能なモデルです。SDK には組み込みの動作がいくつかありますが、独自の動作を作成できます。

ここにいくつかのリンクがあります。(注: URL の「silverlight」に誤解されないように注意してください。動作は WPF と Silverlight の両方でサポートされています)。

情報

ブレンド SDK

行動に関するビデオ

于 2010-01-03T20:53:39.300 に答える