【问题标题】:Pass a CommandParameter using MVVMLight EventToCommand and the Page Load event?使用 MVVMLight EventToCommand 和页面加载事件传递命令参数?
【发布时间】:2011-10-21 13:09:18
【问题描述】:

EventToCommand 在加载事件时未能传递命令参数

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

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

Target 是 View 上的一个字符串 DP。

虚拟机代码:

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

    public RelayCommand<string> LoadCommand { get; private set; }

命令是这样分配的:

    this.LoadCommand = new RelayCommand<string>(this.Load);

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

【问题讨论】:

    标签: load mvvm-light commandparameter eventtocommand


    【解决方案1】:

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

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

    编辑

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

    【讨论】:

    • 是的,这是可能的,但是在使用 public RelayCommand&lt;RoutedEventArgs&gt; LoadCommand{get; private set;} 的 Load 事件的情况下,会导致命令处理程序上的参数为空值。似乎这里有一些与时间方面有关的东西 - 参数尚未设置。
    • 添加了问题解决方案的链接,以及此处的一些行。我会直接发布示例,但在移动设备上编写代码只是背后的痛苦......对不起,但我希望示例仍然有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2016-03-25
    • 2015-02-05
    • 2011-09-13
    相关资源
    最近更新 更多