将登录屏幕数据从用户控件传递到父级

时间:2012-03-14 20:13:35

标签: wpf user-controls

我正在尝试从父MVVM类中的用户控件MVVM访问值 - 所以我可以将菜单设置为启用/禁用。我无法想象如何连线。

由于我遇到了困难(因为我学会实现MVVM),所以对以下内容表示赞赏

Q1)如上所述 - 如何从用户控件(子)MVVM访问父窗口视图模型

Q2)一旦可以访问这些值 - 我需要使用菜单(编辑)项的CommandBinding连接它们(用于启用/禁用)。我该怎么做?

Q3)小问题 - 目前在我的loginviewmodel中 - 只有当我选中时才会启用“提交”按钮 - 如果我想在输入字符时立即执行此操作 - 我该如何处理?          

我的loginscreen.xaml.cs代码

public partial class Login_Screen_User_Control : UserControl
{
    public Login_Screen_User_Control()
    {
        InitializeComponent();
        var loginmodel = new myWindowViewModel();
        DataContext = loginmodel;
    }
}

public class myWindowViewModel
{
    private string _username;
    private string _password;
    public ICommand OkCommand { get; set; }

    public myWindowViewModel()
    {
        OkCommand = new myCommand(myOkExecute, myCanOkExecute);
    }

    public string userName
    { 
        get { return _username; }
        set { _username = value; }
    }

    public string passWord
    {
        get { return _password; }
        set { _password = value; }
    }

    private void myOkExecute(object parameter)
    {
        //Authetication Logic - lets assume this came back as true
    }

    private bool myCanOkExecute(object parameter)
    {
        return (string.IsNullOrEmpty(userName) ? false : (userName.Length > 0 ? true : false));
    }

}

我的ParentApp.xaml代码

<Window x:Class="Complete_Application.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:loc="clr-namespace:_05_User_Control_POC;assembly=05-User_Control_POC"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Menu Grid.Row="0" Name="menu1" Height="25">
        <MenuItem Header="_File">
            <MenuItem Header="_New"/>
            <MenuItem Header="_Open"/>
            <MenuItem Header="_Close"/>
        </MenuItem>
        <MenuItem Header="_Edit">
            <MenuItem Header="_New"/>
            <MenuItem Header="_Open"/>
            <MenuItem Header="_Close"/>
        </MenuItem>
    </Menu>
    <Grid Grid.Row="1">
        <loc:Login_Screen_User_Control></loc:Login_Screen_User_Control>
    </Grid>
</Grid>

myparent.xaml.cs代码

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var mainwindowviewmodel = new parentWindowViewModel();
        DataContext = mainwindowviewmodel;
    }
}

public class parentWindowViewModel
{
    public parentWindowViewModel()
    {
        //??
    }
}

Screenshot of my app

我看了下面这篇文章 - 这个人正在做类似的事情,但是通过我不想使用的单身模式 - WPF MVVM - Simple login to an application

2 个答案:

答案 0 :(得分:1)

<强> A1)
选项A:使用Mediator / Messenger传输值(mvvm light messenger
选项B :(推荐)将LoginVM作为父级的子属性并使用DataTemplate

parentWindowViewModel { 
   LoginVM LoginChild { get; }
}

<Window>...
   <Window.Resources>...
      <DataTemplate DataType={x:Type vm:LoginVM}>...

   <ContentControl Content={Binding LoginChild}/>

A2)我没有通过措辞完全理解,但{Binding LoginChild.VALUE}

A3) Binding.UpdateSourceTrigger

答案 1 :(得分:1)

所有MVVM框架都提供了消息传递功能,因此在视图模型之间共享数据变得如此简单(这就是在Simple MVVM Toolikit中完成的方式):

您的用户控制:

SendMessage(MessageTokens.MyToken, new NotificationEventArgs<object>("MyMessage", myObject));

你的父母:

RegisterToReceiveMessages<object>(MessageTokens.MyToken, OnMyTokenReceived);

private void OnMyTokenReceived(object sender, NotificationEventArgs<object> e)
{
    //Do something with your object here
}

或者,您的父母也可以发送请求来自您的用户控件的信息,并且用户控件会将所需信息发回...