質問
って開発に非常に大き絡アプリを使って味のM-V-VMを呼びかけるM-V-MC(Model-View-ModelController)という組み合わせの間のM-V-C、M-V-VM.また掲載 この答え について意見の取得インスタンスを生成にはM-V-VM"という質問に対しどれにも共通-ミス-ド-イン-コンポーネントのラインナップの開発".
サム 以下のコメントに関する私の答え:
このフォローアップの質問:どのよう いを作成しょうか。使ってい RelayCommandsに結合する行動から ビューのViewModelので、ビュー ななので、アクションは、 火入れを行い、知らない彼は開 新しい。【解決イベントを生成するには VMのリスナーをアンインストールに購読すか?
私が始められ、現在は多くのM-V-VMが開発したこともに生きるべきではViewModel、ものすごく多くの事例からう ジ-スミス や Karl Shifflett.がっていくの場合コマンドのニーズにViewModel.
例えば、ということかしていListViewを表示するお客様に、ボタンをクリックしてもよい編集の現在選択されております。のListView(眺望が出されるCustomerVM(ViewModel).ボタンをクリック火災のEditCustomerCommandるポップアップウィンドウを行なってい編集のプロパティはすべてCustomerVM.ではこEditCustomerCommand。こすか、窓を開けるなどして,(UI機能)で示すべきでは定義されたコードの後ろに見られていますか?
なものとしての私の定義をすべきコマンドのビューに比べViewModel?
マシュー-ライト 国。
新-削除一覧からい 良い例です。その場合、空白に レコードの追加または現在の記録 によって削除され、ViewModel.他の 動きのあるべき への対応に行することができました。
う場合はをクリックしても、新規ボタンで何が起きているのでしょうか。新しいインスタンスのCustomerVMは、親会ViewModelするとともにコレクション。どのようにしてそれが私の編集画面での取得を開設?のばして新しいインスタンスを作成し、お客様のViewModel、そのParentVM.Add(newlyCreatedVM方法。
ということかを削除したお客様の記録をDeleteCommand生活にェースを使用してアクセスしますVMの呼び出しの事業層のみを削除します。することはできないので返しますメッセージェースを使用してアクセスしますいる表示このメッセージdialogbox.どのようなビューのメッセージのコマンドです。
解決
とは思わないん見っている引用質問です。
思考はこの問いを自分のための時間を、より実践的な決定のための私のコードベース
私のコードベースのViewModelったときの行動のようなことが起こして欲しいという事で滞在しました。またしたいと思わないのViewModelを制御します。
何でしょうか?
私は追加のコントローラーナビゲーション:
public interface INavigation
{
void NewContent(ViewModel viewmodel);
void NewWindow(ViewModel viewmodel);
}
このコントローラを含んでいますが。NewContent()が示す新しいコンテンツを現在の画面NewWindow()を新規ウィンドウ、populatesでのコンテンツ表示します。
もちろん私のviewmodelsこんなるビューです。っているのかわかviewmodelたい、なにより例がDeleteCommandが実行され、電話に向けナビゲーションサービス機能 NewWindow新ValidateCustomerDeletedViewModel()) 表示ウィンドウに記載のお客様は削除されました。'(失わせないアイテムはこの単純再生し続けますmessageboxものであるという特別なナビゲーター機能を簡単にmessageboxes).
どのようなviewmodelに向けナビゲーションサービス?
私viewmodelクラスには、新しくオープンしたロフトタイプのコントローラ:
public class ViewModel
{
public INavigation Navigator { get; set; }
[...]
}
がviewmodelは付属のウィンドウ(もしくは何が表示され、ユーザーがウィンドウをリサイズのナビゲーター性で、viewmodelできます。
どのようなナビゲータの作成にviewmodel?
きの簡単なるリストビューを作成するviewmodel、私の場合使用できます簡単な反省から名のマッチング:
public static FrameworkElement CreateView(ViewModel viewmodel)
{
Type vmt = viewmodel.GetType();
// big bad dirty hack to get the name of the view, but it works *cough*
Type vt = Type.GetType(vmt.AssemblyQualifiedName.Replace("ViewModel, ", "View, "));
return (FrameworkElement)Activator.CreateInstance(vt, viewmodel);
}
もちろんのニーズコンストラクタを受け入れviewmodelとしてのパラメータ:
public partial class ValidateCustomerDeletedView : UserControl
{
public ValidateCustomerDeletedView(ValidateCustomerDeletedViewModel dac)
{
InitializeComponent();
this.DataContext = dac;
}
}
どのような私の窓はどうなっているか。
シンプルです:私のメインウィンドウは実施しINavigationインタフェースとしてスタートページに関す。下さい:
public partial class MainWindow : Window, INavigation
{
public MainWindow()
{
InitializeComponent();
NewContent(new StartPageViewModel());
}
public MainWindow(ViewModel newcontrol)
{
InitializeComponent();
NewContent(newcontrol);
}
#region INavigation Member
public void NewContent(ViewModel newviewmodel)
{
newviewmodel.Navigator = this;
FrameworkElement ui = App.CreateView(newviewmodel);
this.Content = ui;
this.DataContext = ui.DataContext;
}
public void NewWindow(ViewModel viewModel)
{
MainWindow newwindow = new MainWindow(viewModel);
newwindow.Show();
}
#endregion
}
(これはもとNavigationWindow、ラッピングセールスやマーケティングの観点ページ)
もちろんこれはテストのナビコントローラで嘲笑す。
んだことでソリューションすることが明らかく私にとってます。そのアイデアやコメント歓迎!
他のヒント
ご削除メッセージボックスの場合、抽出messageboxesインタフェースを介と同様です。もの注これらのインタフェースのための私のコンポーネントのラインナップアプリです。
コンストラクタ
public MyViewModel(IMessage msg)
{
_msg = msg;
}
そして、その方法の削除方法をViewModel...のようなもの
public void Delete()
{
if(CanDelete)
{
//do the delete
}
else
{
_msg.Show("You can't delete this record");
}
}
このテスト容易化できるプラグインと異なるIMessageの実装がない再生し続けますmessagebox.それだけで印刷コンソールには、テスト目的に明らかに御コンポーネントのラインナップアプリが持っているかもしれな実装のように
public class MessageBoxQuestion : IMessage
{
public void Show(string message)
{
MessageBox.Show(message);
}
}
ここの試験の異なる経路考えYes/Noダイアログ)する速くて使いやすいです。想像できる削除を確認するきのいずれかを使用コンクリートのインスタンスIMessageの返true/falseの場合確認、模擬のコンテナ中のテストです。
[Test]
public void Can_Cancel_Delete()
{
var vm = new ProductViewModel(_cancel);
...
}
[Test]
public void Can_Confirm_Delete()
{
var vm = new ProductViewModel(_yes);
...
}
おがどのようにするために使用されるコマンド、インスタンスを生成の新規追加または詳細を見います。いたりしているのと同じように持っています。 景色のみインスタンス化によるその他の意見 当社のアプリです。利用しないコマンドもある。しかしながら、私としての利用ViewModel性の親ビューの子ビュー。
public void Object_DoubleClick(object sender, EventArgs e)
{
var detailView = new DetailView(ViewModel.Product);
detailView.Show();
}
武器agiは、dexで下がらないboxerぐ!
新-削除一覧からう良い例です。その場合、空白のレコードの追加または現在の記録によって削除され、ViewModel.の行為のあるべき対応行することができました。
一方使うコマンドパラメータオブジェクトの事業層の変更ができるとVMができ処理後のコマンドを実行します。