2010-12-22 75 views
1

当我输入使用DefaultButton(编辑登录+ 标签,编辑密码+ 输入)登录密码,该X.Password属性仍没有改变。那么我在使用DefaultButton时如何提交密码?MVVM默认按钮比文本框更快提交文本视图模型

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) |]) 

继电器命令

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) 

回答

6

被设定(缺省),以仅更新当文本框失去焦点的结合。当您按Enter键时,TextBox不会失去焦点。你可以告诉文本框解决这一问题尽快更新绑定值,因为它改变了,就像这样:

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

而且我也不需要“设定值= 密码< - 价值 X.OnPropertyChanged‘密码’ “ 然后 ?所以我需要一些时间来尝试,谢谢 – Cynede 2011-02-24 05:22:45