在使用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.
沒有留言:
張貼留言