1

Caliburn フレームワークを使用して、WPF でプロジェクトを書き直しています。私はC++の世界から来たので、最も単純なことでさえ理解するのが難しい...

だから、私が持っているとしましょう:MainView、MainViewModel、DialogView、DialogViewModel。

MainView.xaml: ...

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

... Caliburn はそれを 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/キャンセル ボタンをこのクラスのメソッドにバインドできますが、さらに先に進む方法がわかりません...

どの方向に進むべきかアドバイスしてもらえますか?

4

2 に答える 2

5

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

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;
    }

ダイアログビュー:

<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>

ダイアログビューモデル:

[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();        
    }
}
于 2012-04-02T17:24:34.400 に答える
0

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

于 2012-04-02T13:37:20.367 に答える