C# 如何从viewmodel中弹出子窗口

C# 如何从viewmodel中弹出子窗口,c#,.net,wpf,mvvm,childwindow,C#,.net,Wpf,Mvvm,Childwindow,我必须在主视图模型中启动某种子窗口,在这个子窗口上,用户将输入一些文本,我必须在关闭子窗口后在主视图模型中使用这些文本 我能够有一个弹出的子窗口,我绑定到它的子窗口视图模型 启动子窗口的主视图模型是: private void OpenLayoutNameWindow() { LayOutName_VM chldWindow =new LayOutName_VM(); chldWindow.Show(); string layOutName = chldWindow.La

我必须在主视图模型中启动某种子窗口,在这个子窗口上,用户将输入一些文本,我必须在关闭子窗口后在主视图模型中使用这些文本

我能够有一个弹出的子窗口,我绑定到它的子窗口视图模型

启动子窗口的主视图模型是:

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.
}
这是子窗口的视图:

<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>
这是子窗口视图模型:

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();
    }
}
类布局名称\u VM:ViewModelBase
{
公共操作命令CloseWindowCommand{get;private set;}
公共布局名称_VM()
{
this.CloseWindowCommand=新操作命令(this.SaveLayOutName);
}
私有字符串layOutName;
公共字符串布局名称
{
得到
{
返回layOutName;
}
设置
{
layOutName=值;
RaisePropertyChanged(“LayOutName”);
}
}
私有void SaveLayOutName(窗口风)
{
风。关闭();
}
内部虚空显示()
{
LayOutName ly=new BrukerApp.LayOutName();
ly.Show();
}
}

如何将在子窗口中输入的文本获取到viewmodel类。

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

chldWindow.ShowDialog();
在关闭对话框窗口之前,您将无法访问以下代码行:

string layOutName = chldWindow.LayOutName;
还请注意,如果您认真考虑遵循MVVM模式,则应该使用某种服务来打开窗口,而不是直接从视图模型中打开:


从视图模型打开对话框,并且仍然能够为这些视图模型编写单元测试,这比必须的要困难得多


我是一个名为MVVM Dialogs的框架的作者,我有一个框架,您可以运行它来展示您正在寻找的东西。

如果您试图使用MVVM,您的代码中不应该有任何内容。我看到您有一个
ViewModelBase
,您正在使用一个MVVM库吗?如果是这样的话,我将研究一下
Mediator
模式或
EventAggregator
模式的flavors实现。谢谢您的评论。您知道C#的MVVM模式是否也适用于Visual Basic吗?你能给我一个关于如何在VisualBasic中实现的参考吗?谢谢
string layOutName = chldWindow.LayOutName;