WPF MVVM命令:多个命令参数

3
也许我的问题更多是关于架构而不是功能,但我正在尝试将一个TextBox绑定到一个命令,并且在该命令中,我想传递多个参数(即自定义对象)。不确定如何以声明性方式(xaml)实现这一点。
ViewA(位于ViewModelA之上)有一个TextBox,它绑定到CommandX。
ViewB(位于ViewModelB之上)(实际上是同一个窗口中的另一个用户控件) 当CommandX触发时,ViewModelB需要执行一些方法。在执行该方法之前,ViewModelB需要更新多个属性。
我的问题是,如何构建我的命令/架构,以便ViewModelB拥有足够的信息来执行其方法。
顺便说一下:ViewModelA具有ViewModelB执行其方法所需的所有必要信息。但是,我不想从那里获取它,因为稍后我希望从不同的视图执行CommandX。
更新
似乎我可以单独设置CommandParameter属性,这可能会绑定到ViewModelA中的复杂类型。这应该足以将所有必要的属性放入其中。
太棒了!
这起作用了!以下是ViewA上我的参数属性长什么样子:
    public ExecuteQueryCommandParameters ExecuteQueryParameters {
        get {
            var p = new ExecuteQueryCommandParameters();
            p.AllColumns = ColumnsMaster;
            p.DatabaseName = SelectedDatabase;
            p.ServerName = SelectedServer;
            p.TopRows = 20;
            p.ViewModelName = "MainDataView";

            return p;
        }
    }

和按钮实现相关
<Button Command="{Binding ExecuteQuery}" CommandParameter="{Binding ExecuteQueryParameters}">Top 20</Button>

更新

这个解决方案存在一个小问题。commandparameter绑定到属性,但它在加载时检索属性,而不是在执行命令时检索属性。我需要在命令执行时检索属性,以便所有属性都具有最新值。你有任何实现这个目标的想法吗?


2
请将您的解决方案发布为答案 - 这在问题中不清楚,会混淆SO查询。 - Greg Sansom
没问题,你可以回答自己的问题。 - BlackICE
我有一个可行的解决方案,但还不是最理想的。一旦我完全解决了它,我会在这里发布,谢谢。 - Sonic Soul
你曾经解决过刷新问题吗?我认为在 ExecuteQueryParameters 上实现 INotifyPropertyChanged 应该可以使对象保持新鲜状态 - 只要每次更新成员变量时都刷新它。 - Bill
1个回答

1

这是我的做法:

在本说明中,我假设所有必要的信息都在一个名为"MyCustomCommandParameters"的类中。

我还假设你的XAML将主父控件的数据绑定设置为ViewModelA。

让ViewModelA公开类型为MyCustomCommandParameters的属性。

然后,在ViewB上创建一个MyCustomCommandParameters类型的DependencyProperty。该属性的处理程序将此信息传递给ViewModelB。

在XAML中,将ViewB的"MyCustomCommandParameters"值绑定到ViewModelA的"MyCustomCommandParameters"属性。

这需要一些单独的管道工作,但然后您将通过XAML绑定实现从ViewModelA到ViewModelB传递信息的目标,并且两个模型不会相互了解。


我有点得出了类似的结论...只是参数对象在ViewA上,这样就没有跨视图依赖。我只需将viewA的参数对象与命令一起传递即可。这样,无论谁执行命令,都不需要知道属性来自哪里。它们只是存在那里。 - Sonic Soul
嘿,安德鲁,如果你想让框架更具可扩展性,怎么做呢?即不是“一次性”的? - Sonic Soul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接