从一个用户控件触发命令并在另一个用户控件的视图模型中处理它

时间:2016-12-27 16:54:32

标签: wpf mvvm

在Commands.cs中,定义了一个命令:

public static readonly RoutedUICommand Account_OpenDetails 
            = new RoutedUICommand("show account details", 
                                  "Account_OpenDetails", 
                                   typeof(MainWindow));

UserControl1View我有:

<i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonDown">
            <i:InvokeCommandAction Command="LocalCommands:Command.Account_OpenDetails" 
                                   CommandParameter="{Binding AccountId}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

UserControl2View我想这样做:

<UserControl.CommandBindings>
        <CommandBinding Command="LocalCommands:Command.Account_OpenDetails" 
                        Executed="{Binding Account_OpenDetails}" />
    </UserControl.CommandBindings>

我希望这会调用UserControl2ViewModel中的以下方法(UserControl2View的DataContext):

public void Account_OpenDetails(object sender, ExecutedRoutedEventArgs e)

相反,我得到了:

  

无法将'System.Reflection.RuntimeEventInfo'类型的对象强制转换为   输入'System.Reflection.MethodInfo'。

基本上,从一个用户控件的XAML我想触发一个Command,它在另一个用户控件的视图模型中处理。我可以在.cs的{​​{1}}处理此问题,但我不想这样做。我希望它在视图模型中处理。

正确的语法是什么?只要我达到同样的行为,我对任何其他想法持开放态度。

1 个答案:

答案 0 :(得分:0)

  

基本上,从一个用户控件的XAML我想触发一个Command,它在另一个用户控件的视图模型中处理

在主视图模型上创建一个共享的布尔标志,该标志将标记第二个控件。请按照以下步骤操作。

  1. 在主视图模型上创建通知的Boolean标志(例如IsAccountDetailsOpen)。
  2. 在辅助控件上使用更改处理程序创建Boolean依赖项属性。在更改处理程序方法中,根据您提到的控件的视图模型执行需要执行的操作。
  3. 在主页面上将依赖项属性绑定到第二个控件的IsAccountDetailsOpen
  4. 在命令代码中,当事件恰好发出第二个控件的信号时,将布尔标志IsAccountDetailsOpen更改为true
  5. -0r-使用双向绑定在第一个控件上创建布尔依赖关系,并将IsAccountDetailsOpen设置为true,以指示另一个控件。