更新/使用另一个ViewModel中的变量

为了练习WPF + MVVM,我决定写一个学校课程。
到目前为止,我有class级和学生class。
还有基本视图模型,ViewModelBase.cs,它派生自INPC,实例类 – “StudentClass”。

所有其他视图模型都派生自viewmodelbase。

问题是我有一个页面/窗口为每个“function”,(例如;查看所有学生,添加学生,删除学生等…)我希望能够从任何地方访问该类应用程序,因为所有的信息基本上存储在那里。

为了保持井井有条,每个“function”都有自己的视图模型(StudentListViewModel.cs,AddStudentViewModel.cs …)。

我试图从viewmodels访问该类,这只会导致类在一个窗口而不是在另一个窗口中更新的情况。

当我设置“学生列表”窗口的视图模型和“添加学生”窗口时,显然会同步列表。 所以我想问题就是类实例得到重复或类似的东西。

我上传了该项目以供参考: http : //www.mediafire.com/?n70c7caqex6be1g

希望有人可以帮助我。

我试着在google上寻找答案,但所有的答案都提到了与框架相关的“信使”和“事件”。 由于我没有使用该项目的框架,这些解决方案不适用于我。

另一种解决方案是将viewmodel的实例传递给另一个,但我的viewmodel都没有调用或实例化另一个viewmodel。

更新:

StudentList.xaml中的XAML :(这是一个用户控件,因为我使用的是名为ModernUI的模板)

           

AddStudent.xaml中的XAML:

            

AddStudentViewModel.cs:

 public class AddStudentViewModel : ViewModelBase { private Student _student; private ICommand _addStudent; private ViewModelBase newIns; public ICommand AddStudent { get { if (_addStudent == null) { _addStudent = new RelayCommand(param => this.Add(), null); } return _addStudent; } } public Student Student { get { return _student; } set { _student = value; NotifyPropertyChanged("Student"); } } private void Add() { StudentClass.StudentList.Add(Student); Student = new Student(); } public AddStudentViewModel() { Student = new Student(); } } 

ViewModelBase.cs:

 public class ViewModelBase : INotifyPropertyChanged { private Class _studclass; public Class StudentClass { get { return _studclass; } set { _studclass = value; NotifyPropertyChanged("StudentClass"); } } public ViewModelBase() { StudentClass = new Class(); Student asaf = new Student(); asaf.Name = "Asaf"; asaf.LastName = "biton"; StudentClass.StudentList.Add(asaf); } public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChanged(string PropertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); } } } 

当我设置“学生列表”窗口的视图模型和“添加学生”窗口时,显然会同步列表。 所以我想问题就是类实例得到重复或类似的东西。

我邀请您在两个视图模型之间通知或通信。 所以我知道实现类似机制的两种方法,但是在这里不使用任何框架。

  1. 构建一个控制器,它将保留实例视图模型列表,然后在视图模型A引发事件时定义规则,然后将事件调用到B.它将花费你很多精力。

  2. 您可以查看“观察者模式”来构建发布/订阅事件。 当A引发发布事件时,已经注册订阅事件的视图模型B执行该函数。 我建议你应该应用一个EventAggregator模式将获得更多通用,并可以使用无处不在。

    关注Martin Fowler:

    Event Aggregator充当许多对象的单个事件源。 它注册许多对象的所有事件,允许客户端只注册聚合器。

    所以你可以看看Martin Fowler的EventAggregator来实现你自己的EventAggregator,或者你可以使用已经内置的EventAggregator模式的Prism框架。 您也可以查看Caliburn微框架 。 它简单,轻量级,具有EventAggreagator模式,WPF中的吨最佳实践是最好的WPF框架之一,可以帮助您在WPF中处理MVVM时节省大量精力。

您可能必须建立某种事件机制。 不要打扰,这是标准的.NET技术。

首先:拥有一个模型层。 这是ViewModel适应视图的基础。 也许它只是某个数据库和视图模型之间的一个薄层。

有了这个,在模型中提供一个事件,告诉你的模型已经以某种方式改变了。

 public event EventHandler ValuesChanged; public class ValueChangedEventArgs : System.EventArgs { public readonly string str; public ValueChangedEventArgs(string str) { this.str = str; } } 

在模型的某个位置,当值发生变化时,触发该事件:

 protected virtual void OnPriceChanged(ValueChangedEventArgs e) { if (ValuesChanged != null) ValuesChanged(this, e); } 

也许是模型中值的设定者。

 public string StringValue { get { return stringValue; } set { OnPriceChanged(new ValueChangedEventArgs(value)); stringValue = value; } } 

然后只需在ViewModel中订阅该事件:

 public void ValuesChangedHandler(object sender, EventArgs e) { // do something with the new value } public StudentListViewModel() { yourModel.ValuesChanged += ValuesChangedHandler; }