【问题标题】:Does (ReactiveUI 6.2) ReactiveList Support Binding in Winforms DataGridView Datasource?(ReactiveUI 6.2) ReactiveList 是否支持 Winforms DataGridView 数据源中的绑定?
【发布时间】:2014-11-29 00:22:47
【问题描述】:

我正在重构一个旧的 winforms 项目以通过 ReactiveUI 使用 MVVM。到目前为止,绑定部分工作得很好,除了 Grid.Datasource = ReactiveList 似乎没有对更改/添加/删除提供任何更新。

我只是想在这里确认一下,由于DataGridView.Datasource只支持数据绑定列表,所以ReactiveUI.ReactiveList在这里不起作用?或者可能有一些可能的解决方法。

【问题讨论】:

    标签: winforms data-binding datagridview reactiveui


    【解决方案1】:

    我一直在为此苦苦挣扎,我想出的方法是用 ReactiveDerivedBindingList 在 ViewModel 上包装一个 ReactiveList。

    我已经基于项目 ViewModel 类创建了一个 BindingSource 用于设计时支持,然后我在运行时替换它:

    private void CreateDerivedBindings()
    {
        this.Articles = this.ViewModel.Articles.CreateDerivedBindingList(x => x);
        this.ViewModel.Articles.ItemChanged.Subscribe(_ => this.Articles.Reset());
        //this.Articles.ChangeTrackingEnabled = true;
        this.articlesDataGridView.DataSource = this.Articles;
    }
    
    private IReactiveDerivedBindingList<ArticleViewModel> Articles { get; set; }
    

    订阅底层 ReactiveList(已启用 ChangeTrackingEnabled)的 ItemChanged 可使网格中的项目在更改时进行更新。在派生的绑定列表上设置 ChangeTrackingEnabled 没有做任何事情。这是一种蛮力方法,我猜会导致网格完全刷新,也许有更巧妙的方法。

    更简单的方法是在 ViewModel 上使用 ReactiveBindingList,但我没有尝试过,因为该类是特定于 winforms 的,我的目标是可以与 WPF 一起使用的 ViewModel。

    【讨论】:

      【解决方案2】:

      ReactiveList 支持INotifyCollectionChanged,我不知道列表可以通过其他方式表明它们已更改。不过,我可能对 Winforms Grid 有误解!

      【讨论】:

      • 我尝试使用 ReactiveList 但添加项目时没有更新。然后我只将 ReactiveList 更改为 BindingList,其他一切都保持不变,网格更新通知立即生效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多