2012-04-02 8 views
1

私はCaliburnフレームワークを使用してWPFでプロジェクトを書き直しています。私はC++の世界から来ていますので、最も単純なものを見つけ出すのにはいくつかの困難があります。OKアクションでのCaliburn MVVM WPFダイアログ

MainView、MainViewModel、DialogView、DialogViewModelがあります。 MainView.xamlで

: ...

<MenuItem Name="Dialog" Header="Dialog"></MenuItem> 

... MainViewModelのメソッドへ カリバーンの境界を:

public void Dialog() 
     { 
      dynamic settings = new ExpandoObject(); 
      settings.WindowStartupLocation = WindowStartupLocation.Manual; 
      _windowManager.ShowWindow(new DialogViewModel(_windowManager), null, settings); 
     } 

それは正常に動作し、ダイアログがポップアップ表示されます。

さて、このダイアログでは私が持っている:

<TextBox Name="Dimension1"/> 
<TextBox Name="Dimension2"/> 

プラス、他のテキストボックス、チェックボックスなど そこOKですし、キャンセルボタン:

<Button Content="OK" Name="OK"></Button> 
<Button Content="Cancel" Name "Cancel"></Button> 

を今、それが今であるとしてDialogViewModelのOK()メソッドとCancel()メソッドにバインドされているため、DialogViewModelでそれらを処理する方法に関する情報を見つけることはできません。
DialogResultsActionクラスが作成されたときに、このクラスのメソッドでOK/Cancelボタンをバインドできますが、さらに進める方法を理解できない例が見つかりました...

私は行く?

+0

あなたはカリバーンマイクロが付属していたサンプルで見たことがありますか?マイクロを使用していない場合は、それを見たいかもしれません。 –

+0

私はMicroを使用しています。サンプルを調べます。あなたは特別なものをお勧めできますか? – user1298416

+0

HelloWindowManagerを調べています。ユーザーがダイアログ内の特定のボタンをクリックすると、ボタンのデータコンテキストがViewModelに渡されます。私の場合は、1つのダイアログに約20個のテキストボックス、チェックボックス、ラジオボタンがあります。それらをすべてViewModelのパラメータとして渡すべきですか、それを行うもっとエレガントな方法がありますか? – user1298416

答えて

1

これはあなたが探しているものかどうかはわかりませんが、DialogViewModelは他の画面と同様に扱うことができます。この例では、OkとCancelはそれぞれのメソッドにバインドされています。技術的にはキャンセルボタンの名前としてx:Name="TryClose"を設定できましたが、この例では「キャンセル」という名前を付けました。

ShellViewModelのOpenメソッドでは、表示する前にダイアログに値をプリセットすることができます。また、参照を取得してから結果が返された後、それらの値を読み取ることもできます。 ShellViewModelで

オープン方法:

public void Open() 
    { 
     var dialogViewModel = IoC.Get<DialogViewModel>(); 
     dialogViewModel.Dimension1 = "123"; 
     dialogViewModel.Dimension2 = "456"; 
     var result = WindowManager.ShowDialog(dialogViewModel); 
     if (dialogViewModel.MyDialogResult == DialogResult.OK) return; 

     //do stuff with results    
     var dim1 = dialogViewModel.Dimension1; 
    } 

DialogView:

<Grid> 
     <StackPanel> 
      <TextBlock x:Name="Dimension1" /> 
      <TextBlock x:Name="Dimension2" /> 
     </StackPanel> 
     <StackPanel Height="50" 
        Orientation="Horizontal"> 
      <Button x:Name="Ok" 
        Content="Ok" /> 
      <Button x:Name="Cancel" 
        Content="cancel" /> 
     </StackPanel> 
    </Grid> 

DialogViewmodel:

[Export(typeof (DialogViewModel))] 
    public class DialogViewModel : Screen 
    { 
     private string _dimension1; 
     public string Dimension1 
     { 
      get { return _dimension1; } 
      set 
      { 
       _dimension1 = value; 
       NotifyOfPropertyChange(() => Dimension1); 
      } 
     } 
     private string _dimension2; 
     public string Dimension2 
     { 
      get { return _dimension2; } 
      set 
      { 
       _dimension2 = value; 
       NotifyOfPropertyChange(() => Dimension2); 
      } 
     } 

     public void Ok() 
    { 
     //Do stuff 
     MyDialogResult = DialogResult.OK; 
     TryClose(); 
    } 

    public void Cancel() 
    { 
     MyDialogResult = DialogResult.Cancel; 
     TryClose();   
    } 
+0

ありがとうございます!これはまさに私が探していたものです。 – user1298416

0

ViewModelがIScreenに基づいている場合は、OkメソッドまたはCancelメソッドでCloseを使用します。結果を返す必要がある場合は、IEventAggregatorを使用して結果を親に返すことをお勧めします。 本当に必要な場合は、GetView()を使用してビューモデルに関連付けられたビューを取得し、正しいタイプにキャストし、結果を設定できます(ビューに結果があると仮定して、Dialogクラスは使用していません) 。

+0

私のモデルはPropertyChangedBase、IShellに基づいています。ここで、IShellは空のintefaceです(私はこの例をどこかに見つけました)。私がOK()メソッドでIScreenを追加してClose()を使用すると、_dimension1、_dimensionなどのさまざまな値はMainViewModelでどのように更新されますか?私はIEventAggregatorについてもっと詳しく知っています...あなたはどんな例を示唆できますか?ありがとうございました! – user1298416

+0

Screen(またはIScreen)はPropertyChangedBaseから派生しています。私はそれがはるかに利用できるように画面から派生し、あなたはすべてのIScreenを実装する必要があります。 –

+0

説明ありがとうございます! – user1298416