2016-12-02 2 views
3

人の名前とアドレスを入力するための2つのフィールドを持つ簡単なダイアログがあり、両方が値を持つ場合にのみ[OK]ボタンを有効にします。ここでは、関連する私の見解の一部である:FSharp.ViewModuleでダイアログボックスのOKボタンを有効にする

<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 

しかし、[OK]ボタンが常に有効になります。私は間違って何をしていますか?

答えて

4

問題は、TextBox.Text = LostFocusのデフォルトのバインディングモードです。 プロパティは更新されていません。

ので:

<TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}"/> 
    <TextBox Text="{Binding Address,UpdateSourceTrigger=PropertyChanged}" /> 

しかし、あなたの人生を容易にFSharp.ViewModuleにおけるいくつかあります。 XAMLで

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 

:そのため

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

おかげで、私はコード内のIsValidプロパティが表示されていない、あなたのケースでは、プロパティIsValidのですか? – DenisV

+0

@DenisV ViewModelBaseにあります –

+0

@ReedCopsey初心者の間違い - 私はWindow.DataContextを設定するのを忘れていました。ダー!しかし、このバリデーションのアプローチはとても素敵でシンプルに見えます。 – DenisV

関連する問題