【问题标题】:WPF Passing CommandParameter to the action Method RelayCommandWPF将CommandParameter传递给动作方法RelayCommand
【发布时间】:2014-06-13 20:40:43
【问题描述】:

我无法通过 XAML 将参数传递给操作方法。

这是我的 XAML

    <Button 
        Name="btnOK"
        Content="OK" 
        HorizontalAlignment="left" 
        Margin="961,253,0,0" 
        VerticalAlignment="Top"  
        Width="67" 
        Command="{Binding CmdCloseWindow, Mode=OneWay}" 
        CommandParameter="{Binding ElementName=ItemWindow}"

这是我的 C# RelayCommand 代码

        CmdGetProductItem = new RelayCommand<object>(p => GetProductItem(), p => CanExecute());
        CmdUnCommpressedFiles = new RelayCommand<object>(p => GetUnCommpressFiles(), p => CanExecute());
        CmdDeCommpressedFiles = new RelayCommand<object>(p => DeCommpressingFiles(), p => CanExecute());
        //CmdSaveProductItemChanges = new RelayCommand(t => SaveChanges(), t=> CanExecute());

        //Error is here
        CmdCloseWindow = new RelayCommand<Window>(p => CloseWindow( *** Asking to put parameter in here **** ), p => CanExecute());

但是我从 XAML 获取参数,所以我不能在上面的签名中放入任何内容,其他帖子状态将其留空,但编译器抱怨。

这是 RelayCommand 调用的方法。

    private void CloseWindow(Window window)
    {
        if (window != null)
        {
            window.Close();
        }
    }

如有任何帮助,我将不胜感激。

【问题讨论】:

  • p 是 ItemWindow 那么为什么不能将其添加到签名 p => CloseWindow(p) 中?
  • 我不知道 Lambda..谢谢你的知识!但是,它现在正在抱怨重载错误,所以我猜 p 不是 window 类型的?
  • 取决于您的错误。放一个断点看看,如果仍然无法正常工作,请告诉我们
  • 它仍然是预运行时,消息是“最佳重载匹配 有一些无效参数......但是,当我将鼠标悬停在 p 上时,它表明它是一个对象类型,而不是窗口类型,这样对吗?
  • 很难说。您可以尝试将命令更改为 RelayCommand 以使其编译,然后检查参数 p

标签: c# wpf xaml command


【解决方案1】:

感谢@dellywheel 为我指明了正确的方向

基本上,relaycommand 的 lambda - 所以在我的例子中 (p) 是对象类型,因此,将其转换为 Window 对象(您传入的参数类型),它将起作用

  CmdCloseWindow = new RelayCommand<Window>(p => CloseWindow((Window) p), p => CanExecute());

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2022-01-26
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多