ビューメッセージングへのMVVM ViewModelに
-
22-09-2019 - |
質問
MVVMの質問。 ビューモデルとビューの間のメッセージング、どのようにそれが最善実装されている?
「あなたは、この選択のためのコメントを入力しました:はアプリケーションは、次のような「ユーザ通信」のいくつかのポイントがあります。ときはい/いいえ/ NAの選択の値が変更されますが、「保存または破棄しますか。 だから私は、ビューのいくつかの方法が禁止されたのViewModelの「メッセージ」に結合する必要があります。
私はMVVM財団のメッセンジャーで始まるパスを下って行きました。しかし、それはより多くのシステム全体の放送の後、イベント/サブスクライバモデルです。だから、アプリはビューの2つのインスタンス(PERSON1 EditViewとPERSON2 EditView)を持っている場合は、それらを開いて、両方の1 ViewModelには、「あなたが保存しますか」というメッセージを発行したときにメッセージが表示されます。
あなたは
?使用している・アプローチのおかげで アンディ
解決
。たとえば、確認メッセージが表示されることがありますか、あなたの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)完全なサンプルはありませんが、うまくいけば、これはあなたのビューとあなたのViewModelはほぼ1つのエンティティとお互いに電話を作っているではない2。
であることを示しています希望このことができます。
他のヒント
何アンダーソンが説明することは、おそらくあなたが記述の特定の要件のために十分です。しかし、あなたはの Expression Blendのビヘイビアのビューモデルとビューの間の相互作用のための強力なサポートを提供し、より複雑なシナリオで有用である可能性を検討することをお勧めします - 「メッセージ」の結合のみを使用あなたがそうでしょう遠くます。
注、Expression BlendのSDKは無償で入手できます - あなたは、SDKや動作を使用するようにExpression Blendのを使用する必要はありません。ブレンドIDEは、「ドラッグ&ドロップの行動のためのより良い作り付けのサポートを持っていないもののます。
はまた、それぞれの行動 'はコンポーネントであることに注意 - 他の言葉では、拡張可能モデルの。そこにあるいくつかのSDKでの行動を内蔵していますが、自分自身の行動を記述することができます。
ここではいくつかのリンクがあります。 (注、URLに「シルバー」はあなたを誤解させてはいけない - 行動はWPFとSilverlightの両方でサポートされています):
情報の