如何在F#中使用WhenAnyValue和ToProperty?

时间:2017-11-26 06:27:56

标签: xamarin f# reactiveui c#-to-f#

我是F#和activeui的新手,有人可以帮助我将以下C#代码翻译成F#

this.WhenAnyValue(e => e.Username, p => p.Password,
    (emailAddress, password) => (!string.IsNullOrEmpty(emailAddress)) && !string.IsNullOrEmpty(password) && password.Length > 6)
    .ToProperty(this, v => v.IsValid, out _isValid);

这是我尝试过的,即使我不知道这是否正确

this.WhenAnyValue(toLinq <@ fun (vm:LoginViewModel) -> vm.Username @>, toLinq <@ fun (vm:LoginViewModel) -> vm.Password @>)
    .Where(fun (u, p) -> (not String.IsNullOrEmpty(u)) && (not String.IsNullOrEmpty(p)) && p.Length > 6)
    .Select(fun _ -> true)
    .ToProperty(this, (fun vm -> vm.IsValid), &_isValid) |> ignore

我收到了这个错误:

错误:连续参数应该用空格或元组分隔,涉及函数或方法应用程序的参数应该用括号括起来

1 个答案:

答案 0 :(得分:0)

这是因为:

not String.IsNullOrEmpty u

圆括号在F#中没有特殊含义,就像它们在C#中一样。在F#中,它们只是括号,而不是调用方法的特殊语法。换句话说,上面的表达式相当于:

not

我认为现在问题应该是显而易见的:这看起来好像你用两个参数调用not (String.IsNullOrEmpty u) 函数,而你实际上要做的是:

not <| String.IsNullOrEmpty u

或者这个:

let notEmpty = not << String.IsNullOrEmpty

// And then:
notEmpty u

或者,替代方案,您可以为此创建一个特殊功能:

hasManyThrough