【问题标题】:WPF MVVM Commands: Multiple Command ParametersWPF MVVM 命令:多个命令参数
【发布时间】:2011-03-19 22:31:24
【问题描述】:

也许我的问题更多的是架构而不是功能,但我正在尝试将 TextBox 绑定到命令,并且在该命令中,我想传递多个参数(即自定义对象)。不确定如何以声明方式 (xaml) 执行此操作。

ViewA(位于 ViewModelA 之上) 它有一个TextBox,绑定到CommandX

ViewB(位于 ViewModelB 之上) (这实际上是与 ViewA 在同一窗口中的另一个用户控件) 当 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>

更新

这个解决方案有一个小障碍。命令参数绑定到属性。但它在加载时检索它,而不是在执行命令时检索它。我需要它在命令执行时发生,以便所有属性都具有最新值。关于如何实现这一目标的任何想法?

【问题讨论】:

  • 请将您的解决方案作为答案发布 - 问题中不清楚并且会弄乱 SO 查询。
  • 是的,完全可以回答您自己的问题。
  • 我有一个可行的解决方案,但还不理想。一旦我完成它,我会在这里发布,谢谢。
  • 您解决过刷新问题吗?我认为在 ExecuteQueryParameters 上实现 INotifyPropertyChanged 将使对象保持新鲜 - 只要您在每次更新成员变量之一时刷新它。

标签: c# .net wpf mvvm icommand


【解决方案1】:

我会这样做:

对于这个解释,我假设所有必要的信息都在一个名为“MyCustomCommandParameters”的类中。

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

让 ViewModelA 公开 MyCustomCommandParameters 类型的属性。

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

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

这是一项一次性的管道工作,但随后您将实现通过 XAML 绑定将信息从 ViewModelA 传递到 ViewModelB 的目标,并且两个模型彼此不知道。

【讨论】:

  • 我有类似的想法。接受,参数对象在 ViewA 上,这样就没有交叉视图依赖。我只是将 viewA 的参数对象与命令一起传递。这样,无论谁执行命令,都不需要知道属性的来源。他们就在那里。
  • 嘿 Andrew,如果您希望框架更具可扩展性,您会怎么做呢?即不是“一次性”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2019-06-03
  • 2023-03-19
  • 1970-01-01
  • 2013-04-03
  • 2010-09-14
  • 2020-11-26
相关资源
最近更新 更多