2012-03-14 90 views
0

我想访问父MVVM类中的用户控件MVVM的值 - 所以我可以将菜单设置为启用/禁用。我无法想象如何将它连接起来。从用户控件传递登录屏幕数据到父

任何帮助表示赞赏下面,因为我已经坚持(我学习贯彻MVVM)

Q1)如上所述 - 如何从用户控件(子)MVVM访问值到父windowviewmodel

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

我已经看过下面的文章 - 的人做确切的类似的事情,但通过Singleton模式,我不想使用 - WPF MVVM - Simple login to an application

回答

1

A1)
选项A:使用一个Mediator /信使传递的值(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

+0

感谢jberger - 我想出去选项B,因为它保留在MS空间内,并且不使用MVVM light messenger – Patrick 2012-03-16 13:46:59

1

所有MVVM框架提供消息传递功能等等的ViewModels之间共享数据变得这样容易(这是它是如何在简单的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 
} 

或者,你的父母也可以发送一条消息,要求从您的用户控制信息和用户控制将发送所需要的信息回来...