2016-06-14 25 views
1

我想爲WinForms使用ReactiveUI 6.5。如何使ReactiveCommand同步?

我需要在viewmodel上調用並在視圖上同步執行的命令。我試過ReactiveCommand.Create().Execute(),但這顯然是異步執行的,這不是我所需要的。

什麼我已經是這樣的:

public class MyViewModel : ReactiveObject 
{ 
    public ReactiveCommand<object> AddNewThingToControl { get; private set; } 

    public ThingType Thing { get; set; } 

    // Ctor 
    public MyViewModel() 
    { 
     AddNewThingToControl = ReactiveCommand.Create(); 
    } 

    // Thing factory, called from somwhere not shown 
    public void CreateAndAddThing() 
    { 
     Thing = new ThingType(); 

     // should not return before Thing is added to myControl 
     AddNewThingToControl.Execute(null); 

     // Code that needs Thing added to myControl goes here. 
     // This doesn't work because DoAddThing() has not been called yet! 
    } 
} 

public class MyView : Form, IViewFor<MyViewModel> 
{ 
    public MyViewModel VM { get; set; } 

    // Ctor 
    public MyView() 
    { 
     VM = new MyViewModel(); 
     VM.AddNewThingToControl.Subscribe(x => { DoAddThing(); }); 
    } 

    private void DoAddThing() 
    { 
     // This doesn't get called until some unknown time 
     // after AddNewThingToControl.Execute() returns! 
     myControl.Things.Add(VM.Thing);  
    } 

    // ----------- 
    #region IViewFor Implementation not shown 
} 

CreateAndAddThing()由代碼調用無論是在UI線程或者從某種工作線程。

創建了一個新的Thing,應該在到達AddNewThingToControl.Execute()之後的行之前將其添加到視圖上的控件。

我該怎麼做ReactiveCommand

回答

1
  • 使MethodThatNeedsThingAdded()返回Task,以便等待。
  • 使CreateAndAddThing()方法asyncawait先執行命令,然後執行MethodThatNeedsThingAdded()
  • 不要致電ReactiveCommandExecute,但ExecuteAsyncTask這是等待!

這可能是代碼:

public async void CreateAndAddThing() 
{ 
    Thing = new ThingType(); 
    await AddNewThingToControl.ExecuteAsyncTask(null); 
    await MethodThatNeedsThingAdded(); 
} 

該解決方案是優雅的,明確的,你確定這兩種方法都始終調用正確的順序。可以這麼說,整個工作對於UI線程來說是異步的,但是可以按照您的需要進行順序和可預測。

你會說:「但我希望這一切都是同步的!」。你是否需要同步執行?出於什麼目的?如果你真的需要這個,恕我直言你已經選擇了錯誤的庫。嘗試自己實現一個Command類(根據WPF控件的需要從ICommand派生)。