我必须在我的主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类。
答案 0 :(得分:0)
您可以拨打ShowDialog()
而不是Show()
来阻止:
chldWindow.ShowDialog();
然后,在对话框窗口关闭之前,您将无法访问以下代码行:
string layOutName = chldWindow.LayOutName;
另请注意,如果您认真遵循MVVM模式,则应使用某种服务来打开窗口而不是直接从视图模型中执行此操作:
答案 1 :(得分:0)
从视图模型中打开对话框,并且仍然可以为这些视图模型编写单元测试,这比以前更难。
我是一个名为 MVVM Dialogs 的框架的作者,我有一个sample,你可以运行它来展示你正在寻找的东西。