MVVMCross:从ViewModel调用函数到View Xamarin

3

当有人点击按钮时,我希望弹出一个窗口。该按钮在从 Web 服务加载的 ListView 中,如何向视图发送消息以调用 AlertDialog 函数?为了更好地理解我的问题,我在下面粘贴了代码:

在我的 ViewModel 中:

public void editPost(Post item)
{
    PostToEdit = item;

    // Call the popup function
}

在我看来:

public Dialog showEditPopup()
{
    var customView = LayoutInflater.Inflate(Resource.Layout.EditDialog, null);

    var builder = new AlertDialog.Builder(this);
    builder.SetView(customView);
    builder.SetPositiveButton("Save", SaveClicked);
    builder.SetNegativeButton("Cancel", CancelClicked);

    return builder.Create();  
}

我尝试创建一个onclick函数,在视图中初始化我的AlertDialog。
var editButton = FindViewById<Button>(Resource.Id.editButton);
editButton.Click += delegate { ShowDialog(EditDialog); }; 

但是应用程序崩溃了,因为在oncreate时帖子没有被加载,所以editButton为null并且点击事件无法设置,因此我想在viewmodel中创建弹出窗口。


你尝试过任何建议的方法吗? - Alex.F
是的,但在我的情况下最终使用AlertDialog并不是最好的方式,因为我需要在Codebehind和ViewModel之间双向传递太多的消息,所以我在视图中创建了一个自定义的粘性弹出窗口,并将参数绑定到VM。非常感谢您的时间,让我明白了我对实现方式的错误理解。 - MaxDOT
2个回答

4

你可以通过设置(从视图)VM上的ActionFunc回调来处理此问题,这将显示对话框,并且可以从VM中启动。


另一种选择是由VM定义一个接口,View将实现它(例如IViewInteraction),它有一个像ShowDialog(string text)这样的方法。

我建议采用第一种方法。


如果您想采用IViewInteraction方法,那么可以在https://github.com/slodge/BindingTalk/blob/master/BindingTalk.Droid/Views/2%20%20More%20Controls/QuestionView.cs中找到示例(VM在https://github.com/slodge/BindingTalk/blob/master/BindingTalk.Core/ViewModels/QuestionViewModel.cs)。 - Stuart

1

可能会有多个场景需要在您的应用程序中显示警告对话框。

MvvmCross中有一个插件可以在所有平台上显示对话框。您可以从视图模型调用它,它将在所有平台上运行。

https://github.com/brianchance/MvvmCross-UserInteraction

我建议您通过NuGet添加它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接