如何从viewmodel

时间:2017-07-10 12:01:58

标签: c# .net wpf mvvm childwindow

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

我可以弹出一个子窗口弹出窗口,它绑定到它的子窗口视图模型

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

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>

这是背后的代码:

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

这是子窗口视图模型:

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

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

2 个答案:

答案 0 :(得分:0)

您可以拨打ShowDialog()而不是Show()来阻止:

chldWindow.ShowDialog();

然后,在对话框窗口关闭之前,您将无法访问以下代码行:

string layOutName = chldWindow.LayOutName;

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

Opening new window in MVVM WPF

答案 1 :(得分:0)

从视图模型中打开对话框,并且仍然可以为这些视图模型编写单元测试,这比以前更难。

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