2016-11-24 7 views
1

ViewModelから宣言、初期化、および開かれたウィンドウを所有者として設定するにはどうすればよいですか?ネクストウィンドウのコードビハインドファイルにWPFのViewModelからウィンドウを所有者として設定する方法

public class ViewModel : INotifyPropertyChanged 

{ 
    // declaration 
    static nextWindow nw; 
    ... 

    public ICommand OpenNextWindow { get { return new RelayCommand(OpenNextWindowExecute, CanOpenNextWindowExecute); } } 

    bool CanOpenNextWindowExecute(object parameter) 
    { 
     return true; 
    } 

    void OpenNextWindowExecute(object parameter) 
    { 
     nw = new nextWindow(); 
     nw.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
     // Set this window as owner before showing it... 
     nw.Show(); 
    } 
} 

私はこのコードの所有者としてネクストウィンドウを設定することができます:

nw.Owner = this; 

私はのviewmodelからそれを実現できますか?ここで

はコードがありますか

+0

...あなたのビューまたは好ましくはいくつかのビューハンドラクラスで

public class RaiseWindowMessage { public string WindowName { get; set; } public bool ShowAsDialog { get; set; } } 
あなたのviewmodelで

public class ViewModel : ViewModelBase { public RelayCommand<string> RaiseWindow => new RelayCommand<string>(raiseWindow, canRaiseWindow); private bool canRaiseWindow(string nextWindowName) { // some logic return true; } private void raiseWindow(string nextWindowName) { RaiseWindowMessage message = new RaiseWindowMessage(); message.WindowName = nextWindowName; message.ShowAsDialog = true; MessengerInstance.Send<RaiseWindowMessage>(message); } } 

.. WindowMessageクラスを作成します。あなたのViewModelにあるウィンドウに、そしてVMから関連するものにウィンドウを設定します。 しかし、あなたはViewModelがあなたのViewを知らないことを望んでいるので、それがきれいな方法であるかどうかはわかりません。 – Belterius

答えて

3

私はViewModelのウィンドウを表示することに関係することは何もしません。 MVVMLightのメッセンジャーサービスを使用してメッセージを送信し、ショーを行い、所有者を設定することができますshinanigaz

1

MVVMの背後にあるアイデアは、スケーラビリティ、テストなどが可能になります。したがって、ビューモデルは常に、ビューの存在を常に意識する必要があります。

したがって、ビューハンドラまたは一部のビューハンドラがメッセージを処理するかどうかを聞き取り、決定するメッセンジャーサービスを利用します。このため、ビューハンドラは、次に呼び出すビューや表示するメッセージボックスを決定します。

利用可能なオプションはたくさんありますが、@OyiwaiはMVVMLightのメッセンジャーサービスは使いやすいと述べています。

パッケージマネージャコンソールで、インストールパッケージMvvmLightLibsを実行します。 MvvmLightLibsには、既に実装したことがわかっているINotifyPropertyChangedの実装が既にあるという点で、追加ボーナスもあります。

これは簡単な例です。私がここで行ったようにcase文を使用することはお勧めできません。

あなたが結合しようとすることができ

public class ViewHandler 
{ 
    public ViewHandler() 
    { 
     Messenger.Default.Register<RaiseWindowMessage>(this, raiseNextWindow); 
    }   

    private void raiseNextWindow(RaiseWindowMessage obj) 
    { 
     // determine which window to raise and show it 
     switch (obj.WindowName) 
     { 
      case "NextWindow": 
       NextWindow view = new NextWindow(); 
       if (obj.ShowAsDialog) 
        view.ShowDialog(); 
       else 
        view.Show(); 
       break; 
      // some other case here... 
      default: 
       break; 
     } 
    } 
} 
関連する問題