如果SourceList为空,如何禁用WinForms按钮

时间:2018-12-25 13:35:58

标签: dynamic-data reactiveui

我一直在将ReactiveUI与WinForms一起使用,只是使用SourceList而不是ReactiveBindingList切换到DynamicData。

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

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

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为空,我将如何禁用按钮?

1 个答案:

答案 0 :(得分:0)

有必要创建一个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;
}

唯一的缺点是我现在有三个列表,但是可以使用。