Winforms 如何使用ReactiveList以便在添加/删除/修改项目时更新UI

Winforms 如何使用ReactiveList以便在添加/删除/修改项目时更新UI,winforms,reactiveui,Winforms,Reactiveui,我正在使用DataGridView创建一个WinForms应用程序。数据源是一个反应列表。但是,向列表中添加新项目不会更新UI 视图模型 public class HomeViewModel: ReactiveObject { public ReactiveCommand<object> AddCmd { get; private set; } ReactiveList<Model> _models; public ReactiveList<

我正在使用DataGridView创建一个WinForms应用程序。数据源是一个反应列表。但是,向列表中添加新项目不会更新UI

视图模型

public class HomeViewModel: ReactiveObject
{
    public ReactiveCommand<object> AddCmd { get; private set; }

    ReactiveList<Model> _models;
    public ReactiveList<Model> Models
    {
        get { return _models; }
        set { this.RaiseAndSetIfChanged(ref _models, value); }
    }

    public HomeViewModel()
    {
        Models = new ReactiveList<Model>() { new Model { Name = "John" } };

        AddCmd = ReactiveCommand.Create();
        AddCmd.ObserveOn(RxApp.MainThreadScheduler);
        AddCmd.Subscribe( _ =>
        {
            Models.Add(new Model { Name = "Martha" });
        });
    }
}

public class Model
{
    public string Name { get; set; }
}
公共类HomeViewModel:ReactiveObject
{
公共反应命令AddCmd{get;private set;}
反应列表模型;
公共反应列表模型
{
获取{return\u models;}
设置{this.RaiseAndSetIfChanged(ref_models,value);}
}
公共HomeViewModel()
{
Models=newreactivelist(){newmodel{Name=“John”};
AddCmd=ReactiveCommand.Create();
AddCmd.ObserveOn(RxApp.MainThreadScheduler);
AddCmd.Subscribe(=>
{
添加(新模型{Name=“Martha”});
});
}
}
公共类模型
{
公共字符串名称{get;set;}
}
看法

公共部分类HomeView:Form,IViewFor
{
公共HomeView()
{
初始化组件();
VM=新的HomeViewModel();
这个.OneWayBind(VM,x=>x.Models,x=>x.gvData.DataSource);
这个.BindCommand(VM,x=>x.AddCmd,x=>x.cmdAdd);
}
公共HomeViewModel VM{get;set;}
对象IViewFor.ViewModel
{
获取{return VM;}
设置{VM=(HomeViewModel)值;}
}
HomeViewModel IViewFor.ViewModel
{
获取{return VM;}
设置{VM=value;}
}
}
  • 景色总是显示“约翰”
  • 调试订阅显示添加的项目
  • 用同样的结果尝试了它
  • 用IReactiveDerivedList尝试了相同的结果
    我想你想要的是一个ReactiveBindingList而不是ReactiveList。这是用于绑定目的的特定于WinForms的ReactiveList版本

    顺便说一句,您的命令可以简化。。喜欢AddCmd=ReactiveCommand.Create(()=>Models.Add(…);谢谢,但是。如果我使用ReactiveBindingList,我将无法共享我的ViewModels,而ReactiveBindingList不会进行修改,如
    模型[0]。Name=“Palma”嗯,您可以从初始VM派生一个WinformsVM,它在主VM的反应列表上创建一组CreateDerViedBindingList(),这样您就可以在平台之间共享您的逻辑。
    
    public partial class HomeView : Form, IViewFor<HomeViewModel>
    {
        public HomeView()
        {
            InitializeComponent();
            VM = new HomeViewModel();
    
            this.OneWayBind(VM, x => x.Models, x => x.gvData.DataSource);
            this.BindCommand(VM, x => x.AddCmd, x => x.cmdAdd);
        }
    
        public HomeViewModel VM { get; set; }
    
        object IViewFor.ViewModel
        {
            get { return VM; }
            set { VM = (HomeViewModel)value; }
        }
    
        HomeViewModel IViewFor<HomeViewModel>.ViewModel
        {
            get { return VM; }
            set { VM = value; }
        }
    }