在WinForms ReactiveUI ViewModel中,我有一个属性设置器的属性可以抛出ArgumentException:
public string Foo
{
get { return _foo; }
set
{
if (value == "ERR" ) throw new ArgumentException("simulate an error");
this.RaiseAndSetIfChanged(ref _foo, value);
Debug.WriteLine(string.Format("Set Foo to {0}", _foo));
}
}
private string _foo;
在View中,属性Foo绑定到文本框uiFoo:
this.Bind(ViewModel, vm => vm.Foo, v => v.uiFoo.Text);
绑定正常工作(如setter的Debug.WriteLine输出所示)。 但是在输入抛出ArgumentException的“ERR”后,绑定不再有效。
在setter中的异常之后,我有什么解决方法可以将工作状态中的绑定带回(或保持)?
答案 0 :(得分:0)
正如我们在您的问题评论中所提到的,属性getter或setter中的异常是 BIG NO,NO 。
以下是两种可用的解决方案:在尝试读取时使用无效值或使用setter方法。我更喜欢后者;特别是当你抛出ArgumentException
时,只应在提供参数时使用。{1}}。 (违反此规则可能会让代码的使用者感到困惑:“当我不调用任何函数时,为什么会出现ArgumentException?”)
这是一种方法:
public string Foo { get; private set; }
public void SetFoo(string value)
{
if(value == "invalid value")
thrown new ArgumentException($"{nameof(Foo)} can't be set to '{value}'", nameof(value));
Foo = value;
}