在 window 关闭时从另一个视图模型获取 属性 值
Get property values from another view model when its window closes
我有一个视图模型,其中有一个命令显示一个新的 window(它有自己的视图模型)。新 window 的视图模型具有各种属性,当我关闭新 window 时,我想将这些属性传递回调用它的第一个视图模型。
我在这里打破了 MVVM 模式,因为用 ShowDialog()
显示新的 window 似乎更快更容易。这是我的代码示例:
主视图模型:
//Note: The OnPropertyChanged and CanExecute functions are implemented
//method via command to show a new window
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
syo.ShowDialog();
}
新 window 的视图模型:
class SYOWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private DateTime _timeStart;
public DateTime TimeStart
{
get { return _timeStart; }
set { _timeStart = value; OnPropertyChanged("TimeStart"); }
}
private DateTime _timeStart2;
public DateTime TimeStart2
{
get { return _timeStart2; }
set { _timeStart2 = value; OnPropertyChanged("TimeStart2"); }
}
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
这是 SYOWindow 的隐藏代码:
using Proj1.ViewModels; //viewmodel located in different folder in project
public partial class SYOWindow : Window
{
public SYOWindowViewModel vm => (SYOWindowViewModel)DataContext; //error here
public SYOWindow()
{
InitializeComponent();
}
private void OKBtn_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
private void CancelBtn_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
}
因此,在我从 MainViewModel 打开带有 'syo.ShowDialog()' 的新 window 之后,我在 SYOWindowViewModel 中为 syo Window 设置了一些属性,我想要 return 那些属性到 MainViewModel。我无法弄清楚 'proper' 和最干净的方法是什么。我读过我可以强制转换 DataContext 然后以这种方式获取值,但这似乎有点不对。但也许是我使用 showdialog 破坏 MVVM 后的唯一方法。
ShowDialog();
阻止执行直到对话框关闭,所以您需要做的就是:
form.ShowDialog();
var myVar = form.myVar;
ShowDialog()
块,因此您可以让 parent 在 ShowDialog()
退出后从 child 的视图模型中获取内容:
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
syo.ShowDialog();
var vm = (SYOWindowViewModel)syo.DataContext;
this.Foo = vm.Foo;
}
如果你给 SYOWindow
a ViewModel
属性:
你可以稍微简化一下代码
public partial class SYOWindow : Window
{
// ...stuff
// C#6 version -- but if you're on an earlier version of C#, you'll get
// "DataContext is a property but is used like a type" and a red squiggly.
//public SYOWindowViewModel ViewModel => (SYOWindowViewModel)DataContext;
// C#<=5. This works fine in C#6 as well.
public SYOWindowViewModel vm { get { return (SYOWindowViewModel)DataContext; } }
// ...more stuff
}
那么parent就可以这样做:
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
syo.ShowDialog();
this.Foo = syo.ViewModel.Foo;
}
如果 SYOWindow
使用 its DialogResult
property,你可以这样做:
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
if (syo.ShowDialog().GetValueOrDefault())
{
this.Foo = syo.ViewModel.Foo;
}
}
我有一个视图模型,其中有一个命令显示一个新的 window(它有自己的视图模型)。新 window 的视图模型具有各种属性,当我关闭新 window 时,我想将这些属性传递回调用它的第一个视图模型。
我在这里打破了 MVVM 模式,因为用 ShowDialog()
显示新的 window 似乎更快更容易。这是我的代码示例:
主视图模型:
//Note: The OnPropertyChanged and CanExecute functions are implemented
//method via command to show a new window
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
syo.ShowDialog();
}
新 window 的视图模型:
class SYOWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private DateTime _timeStart;
public DateTime TimeStart
{
get { return _timeStart; }
set { _timeStart = value; OnPropertyChanged("TimeStart"); }
}
private DateTime _timeStart2;
public DateTime TimeStart2
{
get { return _timeStart2; }
set { _timeStart2 = value; OnPropertyChanged("TimeStart2"); }
}
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
这是 SYOWindow 的隐藏代码:
using Proj1.ViewModels; //viewmodel located in different folder in project
public partial class SYOWindow : Window
{
public SYOWindowViewModel vm => (SYOWindowViewModel)DataContext; //error here
public SYOWindow()
{
InitializeComponent();
}
private void OKBtn_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
private void CancelBtn_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
}
因此,在我从 MainViewModel 打开带有 'syo.ShowDialog()' 的新 window 之后,我在 SYOWindowViewModel 中为 syo Window 设置了一些属性,我想要 return 那些属性到 MainViewModel。我无法弄清楚 'proper' 和最干净的方法是什么。我读过我可以强制转换 DataContext 然后以这种方式获取值,但这似乎有点不对。但也许是我使用 showdialog 破坏 MVVM 后的唯一方法。
ShowDialog();
阻止执行直到对话框关闭,所以您需要做的就是:
form.ShowDialog();
var myVar = form.myVar;
ShowDialog()
块,因此您可以让 parent 在 ShowDialog()
退出后从 child 的视图模型中获取内容:
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
syo.ShowDialog();
var vm = (SYOWindowViewModel)syo.DataContext;
this.Foo = vm.Foo;
}
如果你给 SYOWindow
a ViewModel
属性:
public partial class SYOWindow : Window
{
// ...stuff
// C#6 version -- but if you're on an earlier version of C#, you'll get
// "DataContext is a property but is used like a type" and a red squiggly.
//public SYOWindowViewModel ViewModel => (SYOWindowViewModel)DataContext;
// C#<=5. This works fine in C#6 as well.
public SYOWindowViewModel vm { get { return (SYOWindowViewModel)DataContext; } }
// ...more stuff
}
那么parent就可以这样做:
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
syo.ShowDialog();
this.Foo = syo.ViewModel.Foo;
}
如果 SYOWindow
使用 its DialogResult
property,你可以这样做:
private void ShowSYOWindow(object parameter)
{
SYOWindow syo = new SYOWindow();
if (syo.ShowDialog().GetValueOrDefault())
{
this.Foo = syo.ViewModel.Foo;
}
}