我得到了一个简单的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,该命令也不会按预期激发,所以这似乎只是一个棘手的问题。只有当我写了有效的文本,然后取消它时,按钮才会被禁用。
似乎只有当isValid
从true
进入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示例应用程序,按钮的可用性似乎与我们预期的一样。