2012-03-14 35 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 
} 

或者,你的父母也可以發送一條消息,要求從您的用戶控制信息和用戶控制將發送所需要的信息回來...