C# 在事件(MVVM)上使用GUI功能
我最近开始使用Xamarin和MVVM进行开发,我遇到了一个问题,我真的不知道如何解决 我将C# 在事件(MVVM)上使用GUI功能,c#,xamarin,mvvm,xamarin.forms,C#,Xamarin,Mvvm,Xamarin.forms,我最近开始使用Xamarin和MVVM进行开发,我遇到了一个问题,我真的不知道如何解决 我将视图中的事件绑定到视图模型中的ICommand属性。但是这些事件应该能够触发例如DisplayAlert或Navigation.PushAsync调用 现在我知道这些问题有一些解决方法,但是在ViewModel中引用Navigation对象不会违反ViewModel的预期用途,因为它不知道视图的任何内容 我真的很想保持一个严格的、纯粹的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");
};
};
}
}