通知ViewModel在另一个ViewModel,Devexpress,Winforms中发生了某些事情

时间:2018-06-18 18:23:28

标签: winforms mvvm devexpress

我的问题如下:当我在一个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;
    }
}

1 个答案:

答案 0 :(得分:0)

您似乎在寻找BindingList<T>

要将复杂的双向数据绑定到ComboBoxListBoxDataGridView等列表控件,您需要使用IBindingList的实现作为{{1}控件。作为一种选择,您可以依赖BindingList<T>。这样,基础数据源中的每个添加/删除都将立即反映在控件UI中。

事实上你在DataSource添加/删除项目BindingList<T> ListChanged事件将被列表引发,这会导致数据绑定控件如DataGridView重置绑定并反映用户界面的变化。

虽然使用BindingList<T>允许在添加和删除项目时更新绑定控件,但为了立即反映属性更改,T应该实现INotifyPropertyChanged