我的问题如下:当我在一个ViewModel中执行某些操作(在这种情况下添加新学生)时,我希望在另一个ViewModel中完成某些操作(在本例中调用RaisePropertyChanged)。
在这种情况下,MainWindowViewModel的相应View显示学生列表。 然后我打开StudentWindowViewModel的相应视图,该视图用于在数据库中添加student。当我添加学生时,我希望它立即反映在我的学生列表中。
这是我的代码,但它不刷新学生列表。
[POCOViewModel()]
public class MainWindowViewModel
{
// getting list of students
public virtual List<Student> Students { get; set; } = MainWindowMethods.GetStudents();
private readonly StudentWindowViewModel viewModel = new StudentWindowViewModel();
public MainWindowViewModel()
{
viewModel.ItemsChanged += () =>
{
this.RaisePropertyChanged(x => x.Students);
};
}
}
这是StudentWindowViewModel
public delegate void MyDel();
[POCOViewModel()]
public class StudentWindowViewModel
{
public virtual string StudentCode { get; set; } = "";
public virtual string FirstName { get; set; } = "";
public virtual string LastName { get; set; } = "";
public virtual int Age { get; set; }
public event MyDel ItemsChanged;
//add student in database
public void AddStudent()
{
StudentWindowMethods.AddStudent(new Student
{
StudentCode = StudentCode,
FirstName = FirstName,
LastName = LastName,
Age = Age
});
//this is null, and event isn't invoked
ItemsChanged?.Invoke();
StudentCode = "";
FirstName = "";
LastName = "";
Age = 0;
}
}
答案 0 :(得分:0)
您似乎在寻找BindingList<T>
。
要将复杂的双向数据绑定到ComboBox
,ListBox
或DataGridView
等列表控件,您需要使用IBindingList
的实现作为{{1}控件。作为一种选择,您可以依赖BindingList<T>
。这样,基础数据源中的每个添加/删除都将立即反映在控件UI中。
事实上你在DataSource
添加/删除项目BindingList<T>
ListChanged
事件将被列表引发,这会导致数据绑定控件如DataGridView
重置绑定并反映用户界面的变化。
虽然使用BindingList<T>
允许在添加和删除项目时更新绑定控件,但为了立即反映属性更改,T
应该实现INotifyPropertyChanged
。