WPF MVVM 模式 实现异步登录, 我的做法合理么?

Pc498471249 Pc498471249 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
场景: 用户登录
我的做法,View层文本框和按钮都绑定ViewModel里对应的Property和Command , 在触发Command之后,我开了一个线程用来处理登录的操作,失败就弹出MessboxShow,成功的话就打开主窗体界面,然后问题来了,我应该在ViewModel层的登录方法里写MainWindow m = new MainWindow();m.Show() ???? (假设主窗体叫MainWindow) , MVVM的思想是UI和逻辑分离, ViewModel不应该出现依赖于View的代码, 也就是说,VM层不应该有一切UI元素的存在,不然就违背了MVVM的初衷。 这里我就纠结了。 我需要在登录成功之后,打开主窗体,应该怎么办呢, 几番思考之后我决定使用Action委托, 在View层声明一个静态的LoginAction,执行要要做的事(打开主窗体), 然后在ViewModel中处理登录成功之后,调用LoginAction ,功能算是实现了。 不过我这样的做法合理吗? 还有没有更好的解决方案。

ViewModel代码:

private void InitCommand()
{
LoginCommand = new DelegateCommand() { ExecuteAction = Login };
}

private void Login(object param)
{
if (!string.IsNullOrEmpty(CustomerId) && !string.IsNullOrEmpty(CustomerName) && !string.IsNullOrEmpty(Password))
{
thread = new Thread(new ThreadStart(UserLogin));
thread.Start();
}
else
{
IsShow_Login = Visibility.Visible;
Error_Login = Enums.Error_Null;
}
}

private void UserLogin()
{
string url = string.Format("{0}DataHandler.ashx?PageType={1}&CustomerId={2}&CustomerName={3}&Password={4}", ApplicationHelper.WebServicePath, (int)Enums.PageType.登录, CustomerId, CustomerName, Password);
Button_Content = "登录中...";

string jsonStr = Tools.GetHttpData(url, (msg) =>
{
Error_Login = msg;
IsShow_Login = Visibility.Visible;
Button_Content = "登录";
});
if (jsonStr != Enums.Error_Http)
{
if (jsonStr != Enums.Error_Login)
{
ApplicationHelper.c = JsonConvert.DeserializeObject<Model_Customer>(jsonStr);
/***判断密码保存***/
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("IsChecked").Value = IsChecked.ToString();
if (IsChecked)
{
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("CustomerId").Value = ApplicationHelper.eh.Encrypto(CustomerId);
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("CustomerName").Value = ApplicationHelper.eh.Encrypto(CustomerName);
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("Password").Value = ApplicationHelper.eh.Encrypto(Password);
}
else
{
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("CustomerId").Value = string.Empty;
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("CustomerName").Value = string.Empty;
ApplicationHelper.UserXml.Element("root").Element("UserAccount").Element("Password").Value = string.Empty;
}
ApplicationHelper.UserXml.Save(string.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, "Xml\\UserConfig.xml"));

/******大神看这里,调用委托打开窗体,我做的对吗?******/
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, LoginWindow.Callback_OpenMainWindow);
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, LoginWindow.Callback_Close);
}
else
{
Button_Content = "登录";
Error_Login = Enums.Error_Login;
IsShow_Login = Visibility.Visible;
}
}
thread.Abort();
}


View层的委托代码

public static Action Callback_Close { get; set; }

public static Action Callback_OpenMainWindow { get; set; }

public LoginWindow()
{
InitializeComponent();
this.DataContext = new LoginWindowViewModel();
btn_Close.Callback_Close = () =>
{
this.Close();
};

btn_Close.Callback_Min = () =>
{
this.WindowState = WindowState.Minimized;
};

Callback_Close = () => { this.Close(); };

Callback_OpenMainWindow = () =>
{
MainWindow mw = new MainWindow();
mw.Show();
};
}


请MVVM大神指点一二
...全文

相关推荐

登录进度条效果NET

希望能给大家带来方便,也希望大家能多上传资料共同学些

hechenqingtian

C#打造带动画效果的登录界面实战教程

WPF(Windows Presentation Foundation)是微软推出的基于 .NET 的用户界面框架,支持丰富的图形、动画、样式和数据绑定功能,广泛应用于现代桌面应用程序开发。其核心架构采用分层设计,前端通过XAML(可扩展应用程序标记语言)描述界面结构,后端通过C#代码实现逻辑控制,实现界面与逻辑的分离。XAML是一种声明式语言,用于定义UI元素及其布局方式,具有良好的可读性和可维护性。

Tranyn.X

WPF人员管理系统界面开发全流程:MVVM架构、DataGrid实战与性能优化

WPF作为Windows桌面应用开发的核心框架,凭借矢量渲染与灵活的数据绑定机制,在企业级管理软件中占据重要地位。基于MVVM分层架构,将界面表现与业务逻辑解耦,通过数据绑定和命令系统驱动UI状态流转,可显著提升复杂业务界面的可维护性与扩展性。DataGrid作为人员列表的核心控件,配合虚拟化、分组与模板定制,能在海量数据场景下保持流畅交互;样式与控件模板的统一设计,则赋予系统高度一致的视觉体验。此类技术方案广泛适用于人事管理、MES系统、内部运营后台等桌面端场景,在数据密度、操作效率与视觉规范性之间取得平

芙蓉塘外有轻雷

开题报告2016

2016年毕业设计开题报告,包括具体实现,框架

babywf

WPF工控上位机朝夕教育数字化平台实战源代码

WPF工控上位机朝夕教育数字化平台实战源代码

Macbethad
评论 10
收藏 已收藏
分享
返回顶部
Pc498471249
WPF/Silverlight 8,757 成员 12,031 内容