Skip to content

Commit

Permalink
Fix bug with events getting raised too soon
Browse files Browse the repository at this point in the history
  • Loading branch information
marner2 authored and TysonMN committed Nov 11, 2022
1 parent 0f7d453 commit f8ce593
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions src/Elmish.WPF/DynamicViewModel.fs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,12 @@ module internal ViewModelHelper =
ErrorsChanged = DelegateEvent<EventHandler<DataErrorsChangedEventArgs>>()
}

let updateModel newModel helper =
let getEventsToRaise newModel helper =
helper.Bindings
|> Seq.collect (fun (Kvp (name, binding)) -> Update(helper.LoggingArgs, name).Recursive(helper.Model, newModel, binding))
|> Seq.toList

let raiseEvents eventsToRaise helper =
let {
log = log
nameChain = nameChain } = helper.LoggingArgs
Expand All @@ -90,19 +95,13 @@ module internal ViewModelHelper =
let raiseErrorsChanged name =
log.LogTrace("[{BindingNameChain}] ErrorsChanged {BindingName}", nameChain, name)
helper.ErrorsChanged.Trigger([| helper.GetSender (); box <| DataErrorsChangedEventArgs name |])

let eventsToRaise =
helper.Bindings
|> Seq.collect (fun (Kvp (name, binding)) -> Update(helper.LoggingArgs, name).Recursive(helper.Model, newModel, binding))
|> Seq.toList

eventsToRaise
|> List.iter (function
| ErrorsChanged name -> raiseErrorsChanged name
| PropertyChanged name -> raisePropertyChanged name
| CanExecuteChanged cmd -> cmd |> raiseCanExecuteChanged)

{ helper with Model = newModel }

type [<AllowNullLiteral>] internal DynamicViewModel<'model, 'msg>
( args: ViewModelArgs<'model, 'msg>,
bindings: Binding<'model, 'msg> list)
Expand Down Expand Up @@ -168,7 +167,9 @@ type [<AllowNullLiteral>] internal DynamicViewModel<'model, 'msg>
member _.CurrentModel : 'model = helper.Model

member _.UpdateModel (newModel: 'model) : unit =
helper <- ViewModelHelper.updateModel newModel helper
let eventsToRaise = ViewModelHelper.getEventsToRaise newModel helper
helper <- { helper with Model = newModel }
ViewModelHelper.raiseEvents eventsToRaise helper

override _.TryGetMember (binder, result) =
log.LogTrace("[{BindingNameChain}] TryGetMember {BindingName}", nameChain, binder.Name)
Expand Down

0 comments on commit f8ce593

Please sign in to comment.