从WPF MVVM应用程序中的另一个窗口读取一个窗口中的控件的值

时间:2014-07-31 09:04:33

标签: c# wpf mvvm

我正在创建一个小型WPF应用程序。我必须遵循我新的MVVM模式。

我有两个视图(A,B)和两个视图模型。

这是我的场景,我在窗口A中有一个单选按钮。检查单选按钮后,我在窗口A中单击下一步。该事件将关闭窗口A并打开窗口B.

在窗口B的viewmodel的构造函数中,我需要知道是否检查了窗口A中的Radiobutton。我该怎么做呢?

1 个答案:

答案 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 的示例,而不是为每个命令创建其类同样的事情。