首先,我祝賀你將你的觀點從你的視角模型中分離出來 - 將它們保持在同一個組合中,導致許多人採取他們不應該的捷徑。
與你的按鈕綁定,我建議你把命令代碼放在視圖後面的代碼中。它與視圖的交互導致子窗口被打開,所以命令代碼需要位於視圖模型中根本沒有理由。您的代碼將是這個樣子:
public ICommand OpenChildWindowCommand
{
get
{
return new DelegateCommand<object>(ExecuteOpenChildWindowCommand, CanOpenChildWindowCommandExecute);
}
}
private void ExecuteOpenChildWindowCommand(object context)
{
...code to open the child window...
}
private void CanOpenChildWindowCommandExecute(object context)
{
return true;
}
(該DelegateCommand<T>
是從微軟的PRISM庫)。你的XAML會是這個樣子:
<Button x:Name="MyButtonName"
Command="{Binding OpenChildWindowCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
/>
我建議您做些什麼,然後就是開始使用對話服務 - 這是抽象成一個獨立的輔助式服務的一些對話相關的代碼。進入一個對話服務的細節將會使這個回答有點長,所以這裏的一些有用的鏈接,讓你開始:
如果你把你的新對話框服務使用IoC容器,那麼你可以有一些非常好的解耦MVVM和測試友好代碼,看起來像這樣:
public class MyMainWindow
{
private IDialogService dialogService;
public MyMainWindow(IUnityContainer container)
{
dialogService = container.Resolve<IDialogService>();
}
private void ExecuteOpenChildWindowCommand(object context)
{
var dlg = _dialogService.Show<IMyDialogWindow>();
}
}
(初始化容器並在應用程序啓動時儘早將接口註冊到具體的類映射)。
看看http://stackoverflow.com/questions/3801681/good-or-bad-practice-for-dialogs-in-wpf-with-mvvm – blindmeis