C# 从Caliburn.Micro、WPF、MVVM中的另一个窗口获取信息
我正在基于Caliburn.Micro mvvm框架在我的应用程序中创建登录窗口。那么,如何从Caliburn.Micro初始化的我的登录窗口中的C# 从Caliburn.Micro、WPF、MVVM中的另一个窗口获取信息,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,我正在基于Caliburn.Micro mvvm框架在我的应用程序中创建登录窗口。那么,如何从Caliburn.Micro初始化的我的登录窗口中的TryClose()方法返回属性(例如,如果用户传递了正确的数据,则返回true;如果用户传递了错误的凭据,则返回false)?如何从在IWindowManager.ShowDialog()中打开的窗口中获取信息 首先,我的MainWindowViewModel.cs: using Caliburn.Micro; namespace TaskMana
TryClose()
方法返回属性(例如,如果用户传递了正确的数据,则返回true
;如果用户传递了错误的凭据,则返回false
)?如何从在IWindowManager.ShowDialog()中打开的窗口中获取信息
首先,我的MainWindowViewModel.cs:
using Caliburn.Micro;
namespace TaskManager.ViewModels
{
class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
protected override void OnViewLoaded(object view)
{
IWindowManager manager = new WindowManager();
//Login page, context is data with user's lists
LoginViewModel loginView = new LoginViewModel(context);
manager.ShowDialog(loginView, null, null);
//here i want to get info, if i get logged properly or not
}
public void LoadUserInfoPage() //here starts "main" program
{
ActivateItem(new UserInfoViewModel());
}
//and so on...
}
namespace TaskManager.ViewModels
{
class LoginViewModel : Screen
{
public string Login { get; set; }
public string Password { get; set; }
public LoginViewModel(FakeData context)
{
this.context = context;
}
public void LoginButton()
{
bool check = Services.Login.IsValid(Login, Password, context);
if(check) //if login is OK, check == true
TryClose();
}
private FakeData context { get; set; } //data is here
}
}
然后,我的IsValid()
方法:
namespace TaskManager.Services
{
static class Login
{
static public bool IsValid(string login, string password, FakeData context)
=> context.users.Any(i => i.Login == login);
//i know it is bad, but its only example
}
}
按钮,打开和关闭窗口效果很好(也可以从文本框中阅读)。我只想得到信息(可能通过引用?)如果用户是通过良好的数据
谢谢你的建议 为此,您可以使用EventAggregator
“事件聚合器是一种提供发布功能的服务
以松散方式从一个实体到另一个实体的对象。”
第一步是在ViewModels中创建EventAggregator实例并订阅它。您可以通过两个ViewModels的构造函数中的DI来实现
public class OnLoginAttemptMessage
{
string UserName { get; set; }
bool IsLoginSuccessful { get; set; }
}
对于LoginView模型
private IEventAggregator _eventAggregator;
public LoginViewModel(FakeData context,IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
private IEventAggregator _eventAggregator;
public MainWindowViewModel (IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}
和MainWindowViewModel
private IEventAggregator _eventAggregator;
public LoginViewModel(FakeData context,IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
private IEventAggregator _eventAggregator;
public MainWindowViewModel (IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}
下一步是创建消息对象,它可以在ViewModels之间传输所需的信息
public class OnLoginAttemptMessage
{
string UserName { get; set; }
bool IsLoginSuccessful { get; set; }
}
最后,是时候把一切都放在一起了。在LoginViewModel中的youg LoginButton方法中,我们修改代码以在成功登录时引发事件
public void LoginButton()
{
bool check = Services.Login.IsValid(Login, Password, context);
if(check) //if login is OK, check == true
{
_eventAggregator.PublishOnUIThread(new OnLoginAttemptMessage
{
UserName = Login,
IsLoginSuccessful = check;
});
TryClose();
}
}
最后一步是在MainWindowViewModel中,您需要在其中实现IHandle接口
class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive, IHandle<OnLoginSuccessMessage>
{
public void Handle(OnLoginSuccessMessage message)
{
if(message.IsLoginSuccessful)
{
// Login is successfull, do next steps.
}
}
}
class MainWindowViewModel:Conductor.Collection.OneActive,IHandle
{
公共无效句柄(OnLoginSuccessMessage)
{
if(message.isloginssuccessful)
{
//登录成功,请执行下一步。
}
}
}
你可以在这里阅读更多关于EventAggregator的内容()我可以像这样传输任何我想要的东西吗?字符串、整数等?是的,您可以。您在他们消息类中定义的任何结构都可以传输嗨,我在Caliburn.micro上发布了另一个问题。如果你能看一下,我会很高兴的