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

另外,还有其他文本框、复选框等。然后是确定和取消按钮:

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

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

你能告诉我我应该往哪个方向走吗?

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() 来获取与 viewmodel 关联的视图,将其转换为正确的类型,并设置结果(假设视图有结果,我没有使用 Dialog 类)。

于 2012-04-02T13:37:20.367 回答