6.21.2017

ReactiveUI 的 Interactions

在使用MVVM開發方式時,ViewModel總是會遇到需要由使用者確認的情況,如由使用者確認是否執行刪除動作。這時最簡單的方式可能是直接在ViewModel中顯示訊息視窗,但會導致ViewModel本身和訊息視窗的UI架構綁定 – 這又違反了我們使用MVVM的初衷,且難以被測試。

在MVVMLight中,這種狀況通常會建議使用介面的方式來鬆綁,如使用並注入一個特定的IDialogService服務,而ReactiveUI提供了另一個方式 – Interactions,連結為其文件位置,不過範例程式不完整,可看下列提供的程式碼。

public class ViewModel : ReactiveObject
{
    // 不帶入參數,將回傳bool的一個Interaction
    public Interaction<Unit, bool> ConfirmDel { get; }
    // 實際和View綁定的命令
    public ReactiveCommand DelCommand { get; private set; }

    public ViewModel()
    {
        ConfirmDel = new Interaction<Unit, bool>();
        DelCommand = ReactiveCommand.CreateFromTask(async () =>
        {
            var delete = await Confirm.Handle(Unit.Default);
            if (delete == false)
                return;

            // del stuff...

        }, null);
    }
}

// 原文說明中未實作 IViewFor<>
public class View : IViewFor<ViewModel>
{
    public View()
    {
        this.WhenActivated(d =>
        {
            // _vm 為實作IViewFor時建立的ViewModel實體,可改為自己的命名
            d(_vm.ConfirmDel.RegisterHandler(async inct =>
            {
                var result = 
                    MessageBox.Show(
                        Properties.Resources.AreYouSureToDelThisData, 
                        Properties.Resources.ConfirmDelete, 
                        MessageBoxButton.YesNo, MessageBoxImage.Question);

                inct.SetOutput(result == MessageBoxResult.Yes);
            }));
        });
    }
}

原文中另有全域使用的方式,可供參考。

Written with StackEdit.

沒有留言:

張貼留言