Comments (6)
A similar question has already been asked on SO:
http://stackoverflow.com/questions/35554054/f-wpf-async-command-completion-status/35558857
Thus:
[<STAThread; EntryPoint>]
let main argv =
if SynchronizationContext.Current = null then
DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)
|> SynchronizationContext.SetSynchronizationContext
let win = MainWindow()
win.Root.DataContext <- MainWindowViewModel()
let app = Application()
app.Run(win.Root)
from fsharp.viewmodule.
@FoggyFinder Thank you for the SO link. I had not found that.
I added the code to SetSynchronizationContext to my demo. It is an improvement. The button becomes re-enabled when the asyncWorkflow completes. However, I want to do some more research. The behavior is still not exactly what I would have expected. (I would not have expected the button to be disabled while the asyncWorkflow runs.) But, my expectations may be the problem. Thanks again!
from fsharp.viewmodule.
@WallaceKelly we don't always disable, because there are times when people want to allow more than one execution.
If you make can execute return not self.OperationExecuting
it'll disable and re-enable automatically
from fsharp.viewmodule.
@ReedCopsey I'm glad to hear how you describe it, because that is what I expected. However, that is not what I'm seeing. The behavior I'm seeing is that the button becomes disabled, only allowing one execution, even if my canExecute always returns true.
from fsharp.viewmodule.
@WallaceKelly I'm not sure I follow - you definitely need @FoggyFinder 's workaround (the Sync Context setup I posted in SO). That's actually an issue in C# if you build your own app, too, and use async/await heavily in the VM.
Once that's there, if you change your CanExecute as I mentioned, it should enable/disable:
let canExecute _ = not self.OperationExecuting
member val DoSomethingAsync =
this.Factory.CommandAsyncChecked(asyncWorkflow, canExecute, [ <@ this.OperationExecuting @> ])
This sample from FsXaml shows some ideas around using operation executing: https://github.com/fsprojects/FsXaml/blob/master/demos/WpfMvvmAgent/MainViewModel.fs
If it's still not working, can you post a full repro? I'll take a look.
from fsharp.viewmodule.
(I would not have expected the button to be disabled while the asyncWorkflow runs.)
@WallaceKelly, You mean something like this?
let asyncWorkflowS() =
async {
do! Async.Sleep(3000)
System.Diagnostics.Debug.WriteLine("asyncWorkflow completed.")
} |> Async.Start
member val DoSomethingAsync =
this.Factory.CommandSyncChecked(asyncWorkflowS, canExecute)
from fsharp.viewmodule.
Related Issues (20)
- Constructor fails inside an array under xUnit HOT 5
- Command with multibinding parameter HOT 2
- OperationExecuting probably not working correctly. HOT 1
- Unable to load the FSharp.ViewModule project in Visual Studio 2015 update 1 HOT 4
- TypeProvider removed with no migration plan or forwarding address HOT 3
- Should be able to execute a CommandAsyncChecked-generated command multiple times HOT 2
- Add OperationExecuting as a dependency to Async commands
- Where is this.Factory.SetPropertyDependencies? HOT 2
- Auto-generated UI from F# types HOT 3
- Samples, documentation HOT 1
- XAML editor indicates DataContext does not support view model's type HOT 4
- RaiseCanExecuteChanged does not fire? HOT 13
- EventViewModelBase Backing Field causes XamlObjectWriterException HOT 6
- Execption raises when asynchronous call to a dependent propertie HOT 3
- CollectionChanged not triggering the PropertyDependencies of a Factory.CommandSyncChecked HOT 5
- Backing fields throwing an exception for duplicated keys
- Publish FSharp.ViewModule to NuGet and change FsXaml to get FSharp.ViewModule from NuGet HOT 1
- AppVeyor build is failing HOT 1
- Factory.EventValueCommand does not handle null properly..(?) HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fsharp.viewmodule.