2010-12-22 8 views
1

Wenn ich Passwort Default mit Anmeldung Geben Sie (edit Login + Tab, bearbeiten Passwort + Geben Sie), die X.Password Eigenschaft ist immer noch nicht geändert. Wie kann ich ein Passwort festlegen, wenn ich DefaultButton verwende?MVVM Standardschaltfläche schneller als TextBox begehen Text Ansichtsmodell

member X.Password 
    with get()  = password 
    and set value = 
     password <- value 
     X.OnPropertyChanged "Password" 

member X.LoginCommand = 
    new RelayCommand ((fun canExecute -> true), (fun action -> 
      X.SelectedAccount <- 
       match 
        X.Accounts 
        |> Seq.filter (fun acc -> 
         acc.Name  = login && 
         acc.Password = password) with 
        | s when Seq.isEmpty s -> 
         X.ConvertButtonEnabled <- false 
         ignore <| MessageBox.Show(sprintf 
          "User %s doesn't exist or password incorrect password" X.Login) 
         {Name=""; Role=""; Password=""; ExpenseLineItems = []} 
        | s -> 
         X.ConvertButtonEnabled <- true 
         X.LoginExpander <- false 
         Seq.head s 

      X.Login  <- "" 
      X.Password <- "")) 

XAML:

  <Button Content="Login" Command="{Binding LoginCommand}" Height="23" HorizontalAlignment="Left" Margin="79,71,0,0" Name="LoginButton" VerticalAlignment="Top" Width="75" IsDefault="True" /> 
      <TextBox Text="{Binding Login}" Height="28" HorizontalAlignment="Left" Margin="61,6,0,0" Name="Login" VerticalAlignment="Top" Width="142" /> 
      <TextBox Text="{Binding Password}" Height="26" HorizontalAlignment="Left" Margin="61,34,0,0" Name="Password" VerticalAlignment="Top" Width="142" /> 

VMBase

type ViewModelBase() = 
    let propertyChangedEvent = new DelegateEvent<PropertyChangedEventHandler>() 
    interface INotifyPropertyChanged with 
     [<CLIEvent>] 
     member x.PropertyChanged = propertyChangedEvent.Publish 

    member x.OnPropertyChanged propertyName = 
     propertyChangedEvent.Trigger([| x; new PropertyChangedEventArgs(propertyName) |]) 

Relay Befehl

type RelayCommand (canExecute:(obj -> bool), action:(obj -> unit)) = 
    let event = new DelegateEvent<EventHandler>() 
    interface ICommand with 
     [<CLIEvent>] 
     member x.CanExecuteChanged = event.Publish 
     member x.CanExecute arg = canExecute(arg) 
     member x.Execute arg = action(arg) 

Antwort

6

Die Bindung festgelegt ist (Standardeinstellung), um nur aktualisiert, wenn die TextBox den Fokus verliert. Die TextBox verliert nicht den Fokus, wenn Sie die Eingabetaste drücken. Sie können dieses Problem beheben, indem Sie die Textfelder zu sagen, sobald den gebundenen Wert zu aktualisieren, da sie sich ändert, etwa so:

<TextBox Text="{Binding Login, UpdateSourceTrigger=PropertyChanged}"/> 
    <TextBox Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}"/> 
+0

Und ich brauche nicht "set value = Passwort <- Wert X.OnPropertyChanged‚Passwort‘ " dann ? also brauche ich etwas Zeit, um es zu versuchen, danke – Cynede

+0

Nein, du solltest das nicht tun müssen. –