使用FSharp.ViewModule启用对话框中的“确定”按钮

3

我有一个简单的对话框,包含两个字段用于输入人名和地址,当它们都有值时,我只希望“确定”按钮可用。以下是我的视图中相关部分:

<TextBox Text="{Binding Name}" ... />
<TextBox Text="{Binding Address}" ... />
<Button Content="OK" IsEnabled="{Binding OK, Mode=OneWay}" ... />

这是我的视图模型:

namespace ViewModels

open FSharp.ViewModule
open FSharp.ViewModule.Validation
open FsXaml

type DialogView = XAML<"Dialog.xaml">

type DialogVM() as self =
    inherit ViewModelBase()  

    let name = self.Factory.Backing( <@ self.Name @>, "", notNullOrWhitespace )
    let address = self.Factory.Backing( <@ self.Address @>, "" )

    let hasValue str = not( System.String.IsNullOrWhiteSpace( str ))

    member x.Name 
        with get() = name.Value 
        and set value = name.Value <- value ; self.RaisePropertyChanged( <@ self.OK @> )
    member x.Address 
        with get() = address.Value 
        and set value = address.Value <- value ; self.RaisePropertyChanged( <@ self.OK @> )
    member x.OK with get() = hasValue x.Name && hasValue x.Address

但是“确定”按钮始终是可用的。我做错了什么?
1个回答

3
问题在于TextBox.Text的默认绑定模式为LostFocus,因此该属性不会立即更新。
因此:
    <TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}"/>
    <TextBox Text="{Binding Address,UpdateSourceTrigger=PropertyChanged}" />

但是在FSharp.ViewModule中有一些东西可以让你的生活更轻松。在您的情况下,它是属性IsValid

let name = self.Factory.Backing( <@ self.Name @>, "", notNullOrWhitespace)
let address = self.Factory.Backing( <@ self.Address @>, "", notNullOrWhitespace)

member x.Name 
    with get() = name.Value 
    and set value = name.Value <- value
member x.Address 
    with get() = address.Value 
    and set value = address.Value <- value

在XAML中:

<Button Content="OK" IsEnabled="{Binding IsValid}"  />

谢谢您的回复,但我在代码中没有看到IsValid属性? - DenisV
@DenisV 它在 ViewModelBase 中。 - Reed Copsey
2
@denisv在按钮上设置IsDefault="true" - Reed Copsey
@ReedCopsey IsDefault="true" 没有起作用。所以我最终将 Xaml 放在 C# 项目中,将 F# 代码放在一个单独的库中。然后我在 OK 按钮上添加了一个 Click 处理程序,在代码后台调用 Close()。我不知道是否有更好的方法? - DenisV
@DenisV 为什么不想创建一个新问题或在聊天中询问呢?因为在另一个问题的评论区并不是进行这类讨论的最佳场所。 - FoggyFinder
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接