在我之前的问题“在FSharp.ViewModule中启用对话框OK按钮”中,我已经实现了当对话框中的字段验证器为true时,对话框的OK按钮才能启用,并且ViewModule的IsValid属性变为true。但是在那之后我遇到了另外两个问题:
1. 即使我在XAML中设置了IsDefault="true",单击OK按钮也不能关闭对话框。
2. 当单击OK按钮时,有时候我希望进行更多的检查(例如,检查电子邮件地址),而不仅仅是使用ViewModule的验证器提供的检查。如果这种自定义验证失败,则希望阻止对话框关闭。
但是我不知道如何在使用F#和MVVM时同时解决这两个问题。起初,我尝试将XAML放入C#项目中,并将视图模型代码放入F#库中。然后,我使用代码后台中的OK按钮的Click处理程序来关闭窗口。这解决了第一个问题,但没有解决第二个问题。
以下是我的XAML:
1. 即使我在XAML中设置了IsDefault="true",单击OK按钮也不能关闭对话框。
2. 当单击OK按钮时,有时候我希望进行更多的检查(例如,检查电子邮件地址),而不仅仅是使用ViewModule的验证器提供的检查。如果这种自定义验证失败,则希望阻止对话框关闭。
但是我不知道如何在使用F#和MVVM时同时解决这两个问题。起初,我尝试将XAML放入C#项目中,并将视图模型代码放入F#库中。然后,我使用代码后台中的OK按钮的Click处理程序来关闭窗口。这解决了第一个问题,但没有解决第二个问题。
以下是我的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
函数中加上一个注释,以显示当单击OK按钮时我想要执行的操作:
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
)
views:DialogCloser...
行会出现错误:“命名空间前缀“views”未定义”。 - DenisVdialogResult
未定义 - 请参见我的原始帖子末尾的代码 - DenisV