使用 MVVMLight EventToCommand 和页面加载事件传递 CommandParameter?

Int*_*ce4 2 load commandparameter mvvm-light eventtocommand

EventToCommand 无法在加载事件上传递命令参数

当附加到页面或用户控件的 Load 事件时,EventToCommand 成功调用 ViewModel 中的处理程序,但不传递 CommandParameter。但是,相同的 XAML 附加到另一个事件,例如按钮单击,命令处理程序接收数据绑定数据作为其参数。Xml:

<i:EventTrigger EventName="Loaded" SourceObject="{Binding ElementName=Control}"> <Command:EventToCommand x:Name="etcLoad" Command="{Binding LoadCommand}" CommandParameter="{Binding Target, ElementName=Control}" /> </i:EventTrigger>

目标是视图上的字符串 DP。

虚拟机代码:

    internal void Load(string p_Param)
    {
        this.Initialise();
    }

    public RelayCommand<string> LoadCommand { get; private set; }
Run Code Online (Sandbox Code Playgroud)

并且命令被分配如下:

    this.LoadCommand = new RelayCommand<string>(this.Load);
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定,问题在于绑定晚于分配给目标 DP 或类似的东西。我有兴趣为此尽快找到解决方案,或者以其他方式从 View 中获取字符串并进入 ViewModel,其中从 OnNavigateTo 覆盖分配字符串。目标是根据通过 URI 提供的查询属性提供选项卡的选择,即“/Views/DisplayTabDetails?Tab=Tab1”或类似的。

Axe*_*ger 5

使用该PassEventArgsToCommand属性指示应将事件参数传递给命令。因此,在您的 XAML 中,您应该使用:

<i:EventTrigger EventName="Loaded" 
                SourceObject="{Binding ElementName=Control}"> 
    <Command:EventToCommand x:Name="etcLoad" 
                            Command="{Binding LoadCommand}" 
                            PassEventArgsToCommand="True" /> 
</i:EventTrigger>
Run Code Online (Sandbox Code Playgroud)

编辑

某些事件会在用户交互发生之前触发。在这种情况下通常采用的方法是从后面的代码中调用您的命令。在这篇文章中,您可以看到这个概念,显然您必须将其更改为加载的事件和您的需求,但是概念和原因是相同的。