我正在尝试从父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()
{
//??
}
}
我看了下面这篇文章 - 这个人正在做类似的事情,但是通过我不想使用的单身模式 - WPF MVVM - Simple login to an application
答案 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}
答案 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
}
或者,您的父母也可以发送请求来自您的用户控件的信息,并且用户控件会将所需信息发回...