如何从视图模型中弹出 child window

How to popup child window from viewmodel

我必须在我的主 ViewModel 中启动某种 child window 并且在此 child window 用户将输入一些文本,我必须使用它关闭 child window.

后主视图模型中的文本

我可以弹出 child window 并绑定到它的 child window 视图模型

我要启动的主视图模型 child window 是:

private void OpenLayoutNameWindow()
{
    LayOutName_VM chldWindow =new LayOutName_VM();
    chldWindow.Show();
    string layOutName = chldWindow.LayOutName;
    MessageBox.Show("Name is:"+ layOutName);  //this message box is popuped before i close the child window save button and its empty.
}

这是 child window 的观点:

<StackPanel>
    <Label Margin="0,5,0,0" HorizontalAlignment="Center">Please name your new Layout</Label>
    <TextBox Margin="0,5,0,0" Width="120" Height="20" HorizontalAlignment="Center" Text="{Binding LayOutName, Mode=TwoWay}"></TextBox>
    <Button Margin="0,5,0,0" Width="80" Height="20" HorizontalAlignment="Center" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"> Save</Button>
</StackPanel>

这是背后的代码:

public partial class LayOutName : Window
{
    public LayOutName()
    {
        InitializeComponent();
        this.DataContext = new LayOutName_VM(); ;
    }       
}

这是child window视图模型:

class LayOutName_VM : ViewModelBase
{
    public ActionCommand<Window> CloseWindowCommand { get; private set; }

    public LayOutName_VM()
    {
        this.CloseWindowCommand = new ActionCommand<Window>(this.SaveLayOutName);
    }

    private string layOutName;
    public string LayOutName
    {
        get
        {
            return layOutName;
        }
        set
        {
            layOutName = value;
            RaisePropertyChanged("LayOutName");
        }
    }

    private void SaveLayOutName(Window wind)
    {
        wind.Close();
    }

    internal void Show()
    {
        LayOutName ly = new BrukerApp.LayOutName();
        ly.Show();
    }
}

如何将child中输入的文本window获取到viewmodel class。

您可以调用 ShowDialog() 而不是 Show() 来阻止:

chldWindow.ShowDialog();

那么在对话框 window 关闭之前,您将不会看到以下代码行:

string layOutName = chldWindow.LayOutName;

另请注意,如果您认真遵循 MVVM 模式,则应使用某种服务来打开 window,而不是直接从视图模型中打开:

Opening new window in MVVM WPF

从视图模型打开对话框,并且仍然能够为这些视图模型编写单元测试,这比实际情况更难。

我是一个名为 MVVM Dialogs 的框架的作者,我有一个 sample 你可以 运行 展示它到底是什么你在找