C# 在事件(MVVM)上使用GUI功能

C# 在事件(MVVM)上使用GUI功能,c#,xamarin,mvvm,xamarin.forms,C#,Xamarin,Mvvm,Xamarin.forms,我最近开始使用Xamarin和MVVM进行开发,我遇到了一个问题,我真的不知道如何解决 我将视图中的事件绑定到视图模型中的ICommand属性。但是这些事件应该能够触发例如DisplayAlert或Navigation.PushAsync调用 现在我知道这些问题有一些解决方法,但是在ViewModel中引用Navigation对象不会违反ViewModel的预期用途,因为它不知道视图的任何内容 我真的很想保持一个严格的、纯粹的MVVM模式,那么我如何才能做到这一点呢 编辑 谢谢你的回答。我搜索了

我最近开始使用Xamarin和MVVM进行开发,我遇到了一个问题,我真的不知道如何解决

我将
视图中的事件绑定到
视图模型中的
ICommand
属性。但是这些事件应该能够触发例如
DisplayAlert
Navigation.PushAsync
调用

现在我知道这些问题有一些解决方法,但是在
ViewModel
中引用
Navigation
对象不会违反
ViewModel
的预期用途,因为它不知道
视图的任何内容

我真的很想保持一个严格的、纯粹的MVVM模式,那么我如何才能做到这一点呢

编辑

谢谢你的回答。我搜索了更多,找到了一些博客文章中提到的
Xamarin.forms
库,这些库似乎很有用

我将尝试一下,它有一个
导航服务
和一个
页面对话框服务

编辑02


否则,您可以使用@Julien提到的问题。

您所问的问题在MVVM世界中非常常见,这会使它变成一个固执己见的话题。一些开发人员认为应该在页面/视图之间导航-首先是V,另一些开发人员认为应该在视图模型之间导航-首先是VM。两者都有各自的优缺点,WWW上有很多关于它的资源

我建议您熟悉这两种不同的方法,然后决定使用哪种方法。您可以检查现有的MVVM框架,看看它们是如何解决这个问题的。幸运的是,这个话题很有趣,所以你应该享受调查之旅

很可能不会有适合不同类型项目的银弹。记住这一点


祝你好运

@EvZ的答案很好您必须检查常见的MVVM实践

无论如何,如果您真的不想使用这些模式,您可以使用事件(有时,在某些场景中,它可能很有用)。请看下面的示例代码(代码很简单,但您可以将UI“函数”分解为多个页面,使其更干净……)

除了事件,您还可以使用Xamarin MessagingCenter将视图连接到其ViewModel(参考:

即:

//
///我的观点模型课
/// 
公共类MyVM:INotifyPropertyChanged
{
//虚拟机逻辑
// ...
//事件
私有事件事件处理程序OnRequestShowDialog;
//呼叫事件
公共方法()
{
// ...
OnRequestShowDialog?.Invoke(这是“业务方法已成功完成…”);
}}
/// 
///我的页面类
/// 
公共类MyPage:ContentPage
{
公共MyPage()
{
//新虚拟机
BindingContextChanged+=(发送方,参数)=>
{
//在此处连接到VM的事件
(此.BindingContext作为MyVM)。OnRequestShowDialog+=(e,message)=>{
这个.DisplayAlert(“info”,args,“ok”);
};
};
}
}

希望它能给你一些想法…

嗨,我想这个链接会很有用:
/// <summary>
/// My view model class
/// </summary>
public class MyVM : INotifyPropertyChanged
{
    // VM logic
    // ...

    // events
    private event EventHandler<string> OnRequestShowDialog;

    // calling event
    public void BusinessMethod()
    {
        // ...
        OnRequestShowDialog?.Invoke(this, "Business method completed successfully...");
    }}

/// <summary>
/// My page class
/// </summary>
public class MyPage : ContentPage
{
    public MyPage()
    {
        // New VM 
        BindingContextChanged += (sender, args) =>
        {
            // Connect to your VM's events here
            (this.BindingContext as MyVM).OnRequestShowDialog += (e, message) => {
            this.DisplayAlert("info", args, "ok");
        };
    };
}
}