反应式UI,可以执行不禁用WinForm中的按钮



我得到了一个简单的WinForm应用程序,它有几个文本框和一个确认按钮,我使用的是ReactiveUI

这是我的ViewModel:

public CurrencyViewModel()
{
editCurrency = new Currency();

this.ValidationRule(
viewModel => viewModel.IsoCode,
isoCode => !string.IsNullOrWhiteSpace(isoCode),
"error");
this.ValidationRule(
viewModel => viewModel.Name,
name => !string.IsNullOrWhiteSpace(name),
"error");
NewCommand = ReactiveCommand.Create(() => NewItem());
SaveCommand = ReactiveCommand.Create(() => Save(), this.IsValid());
}
public string IsoCode
{
get => isoCode;
set
{
editCurrency.IsoCode = value;
this.RaiseAndSetIfChanged(ref isoCode, value);
}
}
public string Name
{
get => name;
set
{
editCurrency.Name = value;
this.RaiseAndSetIfChanged(ref name, value);
}
}
private void NewItem()
{
IsoCode = string.Empty;
Name = string.Empty;
Symbol = string.Empty;
}

然后我在视图中绑定我的验证和保存命令:

this.BindValidation(ViewModel, vm => vm.IsoCode, v => v.errorLabelIsoCode.Text).DisposeWith(disposables);
this.BindValidation(ViewModel, vm => vm.Name, v => v.errorLabelName.Text).DisposeWith(disposables);
this.BindCommand(ViewModel, vm => vm.SaveCommand, v => v.sfButtonOk, nameof(sfButtonOk.Click)).DisposeWith(disposables);
this.BindCommand(ViewModel, vm => vm.NewCommand, v => v.sfButtonNew, nameof(sfButtonNew.Click)).DisposeWith(disposables);

我的问题是,当我第一次启动应用程序时,sfButtonOk会保持启用状态,即使isValid()为false,该命令也不会按预期激发,所以这似乎只是一个棘手的问题。只有当我写了有效的文本,然后取消它时,按钮才会被禁用。

似乎只有当isValidtrue进入false时,该按钮才被禁用

这里的问题可能与视图模型初始化太迟有关,或者是由于视图模型属性没有及时在视图端发送更改通知。在调用WhenActivated之前,请确保将视图模型分配给IViewFor.ViewModel属性,或者在视图端实现INotifyPropertyChanged(此外,您可能根本不需要WhenActivated,因为WinForms没有可能导致内存泄漏的依赖属性(

此外,值得注意的是,我们有针对各种UI框架的常青示例应用程序,包括ReactiveUI中的Windows窗体。验证核心存储库https://github.com/reactiveui/ReactiveUI.Validation/blob/d5089c933e046c5ee4a13149491593045cda161a/samples/LoginApp/ViewModels/SignUpViewModel.cs#L43刚刚测试了Winforms示例应用程序,按钮的可用性似乎与我们预期的一样。

最新更新