40091


C#(Visual studio2015)で メイン画面からダイアログを表示しています。

◆メインのViewModel

[code]

        Object _dialogContent;
        public Object DialogContent
        {
            get { return _dialogContent; }
            set
            {
                _dialogContent = value;
                this.SetProperty(ref this._dialogContent, value);
            }
        }
    
        private async void MyDialogShowAsync()
        {
            Exception excep = null;
            try
            {
                var vm = new MyDialogViewModel();
                DialogContent = new MyDialog { DataContext = vm };
                await DialogHost.Show(DialogContent, "RootDialog");
                excep = vm.Excep;
            }
            catch (InvalidOperationException)
            {
            }
            catch (Exception ex)
            {
            }
            GC.Collect();
        }
    
[/code]

◆ダイアログのView  
Command="{x:Static DialogHost.CloseDialogCommand}"/>  
Command="{x:Static DialogHost.CloseDialogCommand}"/>

ダイアログのボタンを押すとダイアログがクローズされます。

ボタンを押下した場合に、何かしらの処理を実施後にクローズしたいと考え、

◆ダイアログのViewModel

[code]

        public DelegateCommand ClancelComamnd { get; set; }
    
        public DelegateCommand OKComamnd { get; set; }
    
        コンストラクタに以下を用意しました。
            this.ClancelComamnd = new DelegateCommand(() =>
            {
            ★①
            });
            this.OKComamnd = new DelegateCommand(() =>
            {
            ★②
            });
    
[/code]

◆ダイアログのViewも以下のように修正しました。  
Command="{Binding OKComamnd}"/>  
Command="{Binding ClancelComamnd}"/>

ダイアログのキャンセルボタン、OKボタンを押下すると★①、★②が通ることは確認できたのですが、  
その後、自身のダイアログをどのようにクローズしていいのかがわかりません。  
★①、★②で何かしらを実施するとクローズは可能でしょうか？


CC BY-SA 3.0
2017-12-05T08:10:43.767
40053
2017-12-06T11:25:58.650
2017-12-06T00:25:39.690
12842
12842
question
c#
C#ダイアログのViewModel内で自身のダイアログをクローズしたい


`DialogHost`は`MaterialDesignInXamlToolkit`のものでしょうか？でしたら[ドキュメント](https://github.com/ButchersBoy/MaterialDesignInXamlToolkit/wiki/Dialogs#close-
dialog-strategies)には三種類の方法が記載されています。

  1. `Show`メソッドの引数で`DialogOpened`イベントを購読し、イベント引数のメソッドを使用する。

例えば

[code]

    class MyDialogViewModel
    {
        internal DialogSession Session { get; set;}
        void Close() => Session?.Close();
    }
    
    await DialogHost.Show(DialogContent, "RootDialog", (s, e) => vm.Session = e.Session);
    
[/code]

  2. 組み込みの`RoutedCommand`を使用する。これはVM内からは難しいです。
  3. `DialogHost.IsOpen`プロパティを`False`に変更する。

これは「メインのViewModel」で適当な`bool`プロパティを定義し、`DialogHost.IsOpen`に双方向バインドしたうえで`MyDialogViewModel`に「メインのViewModel」を渡せばこのプロパティに`false`を設定することでダイアログが閉じられるようになります。

どちらか好みの方で実装してください。


CC BY-SA 3.0
2017-12-06T11:25:58.650
40091
2017-12-06T11:25:58.650
5750
40053
answer