首页 > 解决方案 > 通知 ViewModel 在另一个 ViewModel、Devexpress、Winforms 中发生了一些事情

问题描述

我的问题如下:当我在一个 ViewModel 中做某事(在这种情况下是添加新学生)时,我想在另一个 ViewModel 中做某事(在这种情况下调用 RaisePropertyChanged)。

在这种情况下,MainWindowViewModel 的相应视图显示学生列表。然后我打开StudentWindowViewModel对应的view,用来在数据库中添加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;
    }
}

标签: winformsmvvmdevexpress

解决方案


看来您正在寻找BindingList<T>.

要将复杂的双向数据绑定到列表控件,如ComboBox,ListBoxDataGridView,您需要使用控件的IBindingListasDataSource实现。作为一种选择,您可以依赖BindingList<T>. 这样,底层数据源中的每个添加/删除都将立即反映在控件 UI 中。

BindingList<T>实际上,您在事件中添加/删除项目ListChanged将由列表引发,这会导致数据绑定控件(如DataGridView重置绑定)并反映 UI 中的更改。

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


推荐阅读