嵌套的MVVM和RelayCommand

本文关键字:RelayCommand MVVM 嵌套 | 更新日期: 2023-09-27 17:58:36

我的应用程序使用嵌套的ViewModel结构。我有一个父视图模型,其中包含子视图模型的列表。绑定工作得很好,我可以通过按钮执行relaycommand。

虽然这很好,但我只能从子视图模型中访问数据,而不能从父视图模型中。如何访问父视图模型中的数据,或在父视图模型上执行函数,并将所需的数据从子视图传递给父视图?

编辑:这就是我的视图模型的样子:

父级:

public string Name { get; set; }
public List<ChildViewModel> Children { get; set; }
private RelayCommand _parentCommand;
    public RelayCommand ParentCommand
    {
        get
        {
            if (_parentCommand== null)
            {
                _parentCommand= new RelayCommand(() =>
                {
                    //some code
                },
                () => true);                   
            }
            return _parentCommand;
        }
    }

儿童:

public string Name_Child { get; set; }
private RelayCommand _childCommand;
    public RelayCommand ChildCommand
    {
        get
        {
            if (_childCommand== null)
            {
                _childCommand= new RelayCommand(() =>
                {
                    //some code
                },
                () => true);                   
            }
            return _childCommand;
        }
    }

我的问题是,我需要同时使用父视图模型中的Name_Child和Name,并且我只能在RelayCommands中访问其中一个。

嵌套的MVVM和RelayCommand

如何访问父视图模型中的数据,或在父视图模型上执行函数,并将所需的数据从子视图传递给父视图?

如果您的RelayCommand需要使用参数执行,则需要使用RelayCommand<T>而不是RelayCommand。由于您有一个子视图模型列表,我认为您可以正确访问子视图模型。例如,您可以修改父视图模型中的RelayCommand,如下所示:

private RelayCommand<string> _parentCommand;
private string parameter;
public RelayCommand<string> ParentCommand
{
    get
    {
        if (_parentCommand == null)
        {
            _parentCommand = new RelayCommand<string>(parameter => child.ChildCommand.Execute(parameter));
        }
        return _parentCommand;
    }
}

然后在您的Child视图模型中,例如:

public ChildViewModel()
{
    ChildCommand = new RelayCommand<string>((s) => Test(s));
}
public RelayCommand<string> ChildCommand { get; set; }
private void Test(string s)
{
    throw new NotImplementedException();
}