我正在创建一个小型WPF应用程序。我必须遵循我新的MVVM模式。
我有两个视图(A,B)和两个视图模型。
这是我的场景,我在窗口A中有一个单选按钮。检查单选按钮后,我在窗口A中单击下一步。该事件将关闭窗口A并打开窗口B.
在窗口B的viewmodel的构造函数中,我需要知道是否检查了窗口A中的Radiobutton。我该怎么做呢?
答案 0 :(得分:0)
如果您必须遵循MVVM模式",您必须"必须"执行以下操作。
首先,您需要为视图A和视图B创建两个ViewModel(但如果您需要 - 您只能保留一个ViewModel)。对于ViewModelA,您应该创建 ICommand 属性,使用下一个按钮绑定,并使用bool属性 IsChecked 。 ViewModelB应该包含一个构造函数,它将接受bool参数,或者一个属性,它应该在视图B显示之前更新。
以下是如何实现的例子:
public class ViewModelA : ViewModelBase
{
public ViewModelA()
{
_nextCommand = new Cmd(this);
}
public ICommand NextCommand { get { return _nextCommand; } }
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
RaisePropertyChanged("IsChecked");
}
}
private ICommand _nextCommand;
private bool _isChecked;
}
在A的* .xaml视图中,您应该具有以下内容:
<RadioButton IsChecked="{Binding Path=IsChecked}" />
<Button Content="Next" Command="{Binding Path=NextCommand}" />
请注意:该视图的 DataContext 应为 ViewModelA 类型。
对于ViewModelB:
public class ViewModelB : ViewModelBase
{
private bool _isAChecked;
public bool IsAChecked
{
get
{
return _isAChecked;
}
set
{
_isAChecked = value;
RaisePropertyChanged("IsAChecked");
}
}
}
public class Cmd : ICommand
{
ViewModelA _vmA;
public Cmd(ViewModelA vmA)
{
_vmA = vmA;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
var vmB = new ViewModelB();
vmB.IsAChecked = _vmA.IsChecked;
// after that create ViewB, and set its DataContext to vmB
}
}
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
您可以看到 RelayCommand 或 DelegateCommand 的示例,而不是为每个命令创建其类同样的事情。