带有 OK 动作的 Caliburn MVVM WPF 对话框

use*_*416 1 c# wpf button mvvm caliburn

我正在使用 Caliburn 框架在 WPF 中重写一个项目。我来自 C++ 世界,所以即使是最简单的事情也有一些困难......

所以,假设我有:MainView、MainViewModel、DialogView、DialogViewModel。

在 MainView.xaml 中:...

<MenuItem Name="Dialog" Header="Dialog"></MenuItem>
Run Code Online (Sandbox Code Playgroud)

... Caliburn 将其绑定到 MainViewModel 中的一个方法:

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

它工作正常,弹出对话框。

现在,在这个对话框中,我有:

<TextBox Name="Dimension1"/>
<TextBox Name="Dimension2"/>
Run Code Online (Sandbox Code Playgroud)

加上,其他文本框,复选框等。然后有确定和取消按钮:

<Button Content="OK" Name="OK"></Button>
<Button Content="Cancel" Name "Cancel"></Button> 
Run Code Online (Sandbox Code Playgroud)

现在,就像现在一样,它们绑定到 DialogViewModel 中的 OK() 和 Cancel() 方法,我无法弄清楚或找到有关如何在 DialogViewModel 中处理它们的信息。
我在创建 DialogResultsAction 类时找到了一个示例,我可以将 OK/Cancel 按钮与此类中的方法绑定,但无法理解如何进一步进行...

你能建议我应该往哪个方向走吗?

Der*_*tie 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;
    }
Run Code Online (Sandbox Code Playgroud)

对话框视图:

<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>
Run Code Online (Sandbox Code Playgroud)

对话框视图模型:

[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();        
    }
}
Run Code Online (Sandbox Code Playgroud)