嵌套的 MVVM 和 RelayCommand

Nested MVVM and RelayCommand

我的应用使用嵌套的 ViewModel 结构。我有一个 parent 视图模型,其中包含一个 child 视图模型列表。绑定工作正常,我可以很好地从按钮执行中继命令。

虽然这工作正常,但我只能从 child 视图模型中访问数据,而不能从 parent 中访问数据。如何从 parent 视图模型访问数据或在 parent 视图模型上执行函数并将其所需的数据从 child 传递到 parent?

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

Parent:

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;
        }
    }

Child:

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 和 parent 视图模型中的名称,我只能在 RelayCommands 中访问其中之一。

How can I access data from the parent viewmodel or execute a function on the parent viewmodel and pass the data it needs from the child to the parent?

如果你的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;
    }
}

然后在您的子视图模型中:

public ChildViewModel()
{
    ChildCommand = new RelayCommand<string>((s) => Test(s));
}

public RelayCommand<string> ChildCommand { get; set; }

private void Test(string s)
{
    throw new NotImplementedException();
}