在我之前的问题“使用 FSharp.ViewModule 启用对话框 OK 按钮”中,我达到了仅当对话框字段的验证器为 true 并且 ViewModule 的 IsValid 属性为 true 时才启用对话框的 OK 按钮的地步。但在那之后我又遇到了几个问题:
1)即使我IsDefault="true"
在 XAML 中设置,单击 OK 按钮也没有关闭对话框。
2) 当单击 OK 按钮时,有时我想做比 ViewModule 验证器提供的更多的检查(例如,检查电子邮件地址)。然后,如果此自定义验证失败,我想阻止对话框关闭。
但是我不知道在使用 F# 和 MVVM 时如何做。首先,我尝试将 XAML 放入 C# 项目中,并将视图模型代码放入 F# 库中。然后我在后面的代码中使用了 OK 按钮的 Click 处理程序来关闭窗口。这固定了 1),但不是 2)。
所以这是我的 XAML:
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="OK" IsEnabled="{Binding IsValid}" IsDefault="true" Command="{Binding OkCommand}"
<!--Click="OnOK"--> />
还有我的视图模型-在validate
函数中添加注释以显示单击“确定”按钮时我想要做什么:
let name = self.Factory.Backing( <@ self.Name @>, "", notNullOrWhitespace)
let email = self.Factory.Backing( <@ self.Email @>, "", notNullOrWhitespace)
let dialogResult = self.Factory.Backing( <@ self.DialogResult @>, false )
let isValidEmail (e:string) = e.Length >= 5
member self.Name
with get() = name.Value
and set value = name.Value <- value
member self.Email
with get() = email.Value
and set value = email.Value <- value
member self.DialogResult
with get() = dialogResult.Value
and set value = dialogResult.Value <- value
member self.OkCommand = self.Factory.CommandSync(fun () ->
if not <| isValidEmail(email.Value) then
MessageBox.Show("Invalid Email") |> ignore
else
dialogResult.Value <- true
)