ReactiveUI:属性设置器中的异常后绑定丢失

时间:2017-07-11 07:28:40

标签: reactiveui

在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中的异常之后,我有什么解决方法可以将工作状态中的绑定带回(或保持)?

1 个答案:

答案 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;
}