Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Caliburn.Micro、WPF、MVVM中的另一个窗口获取信息_C#_Wpf_Mvvm_Caliburn.micro - Fatal编程技术网

C# 从Caliburn.Micro、WPF、MVVM中的另一个窗口获取信息

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

我正在基于Caliburn.Micro mvvm框架在我的应用程序中创建登录窗口。那么,如何从Caliburn.Micro初始化的我的登录窗口中的
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上发布了另一个问题。如果你能看一下,我会很高兴的