仅在WPF MVVM中的两个视图之间通信
我在MVVM(WPF)中有两个视图。第一个视图包含两个文本框:用户名、密码,第二个视图有两个按钮:提交和清除。这两个视图现在都已设置为表单。当我按下“清除”按钮时,两个文本框都被清除,并在提交中显示用户名和密码的消息。我只使用MVVM+WPF,而不是prism 第一视图的模型视图:仅在WPF MVVM中的两个视图之间通信,wpf,mvvm,Wpf,Mvvm,我在MVVM(WPF)中有两个视图。第一个视图包含两个文本框:用户名、密码,第二个视图有两个按钮:提交和清除。这两个视图现在都已设置为表单。当我按下“清除”按钮时,两个文本框都被清除,并在提交中显示用户名和密码的消息。我只使用MVVM+WPF,而不是prism 第一视图的模型视图: class LoginView:ViewModelBase { string _userName; public string UserName {
class LoginView:ViewModelBase
{
string _userName;
public string UserName
{
get {return _userName ; }
set {
if (_userName != value)
{
_userName = value;
}
base.OnPropertyChanged(UserName);
}
}
string _Pwd;
public string PWD
{
get { return _Pwd; }
set
{
_Pwd = value;
base.OnPropertyChanged(_Pwd);
}
}
}
和按钮
class ButtonHandler
{
private DelegateCommand _ClearData;
public ICommand ClearCommand
{
get
{
if (_ClearData == null)
{
_ClearData = new DelegateCommand(ClearText);
}
return _ClearData;
}
}
LoginView lg = new LoginView();
private void ClearText()
{
lg.UserName = "";
lg.PWD = "";
}
}
和查看第一个控件的代码
<Label Content="Login" Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Left"
FontFamily="Georgia" FontSize="24" FontWeight="UltraBold" ></Label>
<Label Content="User Name" Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></Label>
<Label Content="Password" Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></Label>
<TextBox Name="username" Grid.Row="1" Grid.Column="1" Margin="100,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ></TextBox>
<TextBox Name="pwd" Grid.Row="2" Grid.Column="1" Margin="100,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Path=PWD,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Separator Grid.Row="0" Grid.Column="1" Height="5" Margin="0,40,0,0" Background="Green"></Separator>
和按钮视图
<Button x:Name="Submit" Content="Submit" Grid.Column="1"></Button>
<Button x:Name="Clear" Content="Clear" Grid.Column="2"
Command="{Binding Path=ClearCommand, Mode=OneWay,
UpdateSourceTrigger=PropertyChanged}" >
</Button>
为什么不工作?您没有正确使用MVVM模式,使用此模式时,ViewModel不应引用视图。命令是ViewModel的一部分,因此对
LoginView
的引用违反了该模式
你有两个输入字段和一个按钮?为此,我将有一个单视图模型和一个单视图。ViewModel将公开两个字符串属性(用户名和密码)和一个绑定到清除按钮的命令。当命令执行时,它将清除ViewModel上的用户名和密码文本。视图将随之更新。您没有正确使用MVVM模式,使用此模式时,ViewModel不应引用视图。命令是ViewModel的一部分,因此对
LoginView
的引用违反了该模式
你有两个输入字段和一个按钮?为此,我将有一个单视图模型和一个单视图。ViewModel将公开两个字符串属性(用户名和密码)和一个绑定到清除按钮的命令。当命令执行时,它将清除ViewModel上的用户名和密码文本。视图将随之更新。MVVM的基本原则是拥有一个视图可以绑定到的类,该类中包含所有应用程序逻辑。其中一个主要原因是,如果您想要一个用户名,就要公开视图绑定到的属性,然后当您想要登录时,就要创建一个函数,使用这些绑定值将应用程序的业务逻辑层提交给您 在您的示例中,这似乎是利用MVVM的一种方法:
public class LoginViewModel
{
public string UserName {get;set;}//Implement INotifyPropertyChanged
public string PWD {get;set;}
private DelegateCommand _ClearData;
public ICommand ClearCommand
{
get
{
if (_ClearData == null)
{
_ClearData = new DelegateCommand(ClearText);
}
return _ClearData;
}
}
private void ClearText()
{
UserName = "";
PWD = "";
}
}
然后在xaml中:
<TextBox Text={Binding UserName} />
<TextBox Text={Binding PWD} />
<Button Command={Binding ClearCommand}/>
MVVM的基本原则是拥有一个视图可以绑定的类,该类包含所有应用程序逻辑。其中一个主要原因是,如果您想要一个用户名,就要公开视图绑定到的属性,然后当您想要登录时,就要创建一个函数,使用这些绑定值将应用程序的业务逻辑层提交给您 在您的示例中,这似乎是利用MVVM的一种方法:
public class LoginViewModel
{
public string UserName {get;set;}//Implement INotifyPropertyChanged
public string PWD {get;set;}
private DelegateCommand _ClearData;
public ICommand ClearCommand
{
get
{
if (_ClearData == null)
{
_ClearData = new DelegateCommand(ClearText);
}
return _ClearData;
}
}
private void ClearText()
{
UserName = "";
PWD = "";
}
}
然后在xaml中:
<TextBox Text={Binding UserName} />
<TextBox Text={Binding PWD} />
<Button Command={Binding ClearCommand}/>
ColinE感谢您的欣赏实际上我是MMVM的新用户,我尝试在两个视图之间进行通信,因此我创建了两个视图我知道这项工作是通过单个视图完成的。请注意:很少有情况下ViewModel必须引用视图。例如,当使用ViewModel First方法时,PRISM就是这种情况。在这里,引用用于设置视图的数据上下文(使用接口使视图独立耦合仅用于设置数据上下文)。但您的主要信息是正确的:ViewModel不应直接与视图交互。ColinE感谢您的欣赏实际上我是MMVM的新用户我尝试在两个视图之间进行通信,因此,我创建了两个视图,我知道这项工作是由单个视图完成的。请注意:很少有情况下ViewModel必须引用视图。例如,当使用ViewModel First方法时,PRISM就是这种情况。在这里,引用用于设置视图的数据上下文(使用接口使视图独立耦合仅用于设置数据上下文)。但是您的主要信息是正确的:ViewModel不应该直接与视图交互。您可以使用标点符号吗?您可以使用标点符号吗?