【问题标题】:How to disable WinForms button if SourceList is empty如果 SourceList 为空,如何禁用 WinForms 按钮
【发布时间】:2019-01-20 20:24:08
【问题描述】:

我一直在使用带有 WinForms 的 ReactiveUI,并且刚刚切换到 DynamicData,使用 SourceList 而不是 ReactiveBindingList。

根据this issue,添加了 WinForms IBindingList 集合支持。

我有一个绑定到字符串列表的列表框。为了使它与 WinForms 一起工作,我创建了一个连接到 SourceList 的 BindingList:

var Images = new SourceList<string>();
var ImagesBindableWinForms = new BindingList<string>();
Images.Connect().Bind(ImagesBindableWinForms).Subscribe();

BindingList 然后按如下方式绑定到列表框,效果非常好:

d(this.Bind(ViewModel, x => x.AdInfo.ImagesBindableWinForms, x => x.listImages.DataSource));

有一个按钮可以从列表中删除项目。如果列表为空,则应禁用它。在切换到 SourceList 之前,这曾经可以工作:

ViewModel.DeleteImageCmd = ReactiveCommand.Create(DeleteImage, ViewModel.CanDeleteImage());

public IObservable<bool> CanDeleteImage()
{
    var canDeleteImage = this.WhenAnyValue(vm => vm.AdInfo.Images.Count)
        .Select(x => x > 0);
    return canDeleteImage;
}

代码将根据列表计数启用或禁用按钮。

相同的代码不再有效。我想更新计数时不会触发任何事件。

如果 SourceList 为空,我将如何禁用该按钮?

【问题讨论】:

    标签: dynamic-data reactiveui


    【解决方案1】:

    有必要创建一个 ObservableCollectionExtended 并将其绑定到 SourceList。 CanDeleteImage 应该使用它而不是 SourceList 或 BindingList:

    var ImagesBindable = new ObservableCollectionExtended<string>();
    Images.Connect().Bind(ImagesBindable).Subscribe();
    public IObservable<bool> CanDeleteImage()
    {
        var canDeleteImage = this.WhenAnyValue(vm => vm.AdInfo.ImagesBindable.Count)
            .Select(x => x > 0);
        return canDeleteImage;
    }
    

    唯一的缺点是我现在有三个列表,但它可以工作。

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2018-11-06
      • 2018-11-28
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多