【问题标题】:Why is my CommandParameter sometimes (but not always) null despite being declared in markup?为什么我的 CommandParameter 有时(但不总是)为空,尽管在标记中声明了?
【发布时间】:2011-12-03 08:19:00
【问题描述】:

我的代码大致如下:

<MenuItem Header="Do Something"
          Command="{Binding ChangeSomeEnumValue}"
          CommandParameter="{x:Static someNamespace:SomeEnum.EnumValue}" />

在用作DataContext的viewmodel中:

// RelayCommand takes an Action<object> to be used by Execute, and a
// Predicate<object> to be used by CanExecute.
this.ChangeSomeEnumValue = new RelayCommand(
    p => this.CurrentEnumValue = (SomeEnum)p,
    ChangeSomeEnumValuePredicate);

...

bool ChangeSomeEnumValuePredicate(object commandParameter)
{
    Console.WriteLine(commandParameter);
    var enumValue = (SomeEnum)commandParameter;
    ...
    return true;
}

MenuItem首次显示时,输出为:

EnumValue
EnumValue
EnumValue

当我点击MenuItem 时,“EnumValue”又打印了 3 次,然后我在var enumValue = (SomeEnum)commandParameter 行上得到一个NullReferenceExceptioncommandParameter 为空)。

我这辈子都想不出为什么CommandParameter 在前几次CanExecute 被调用时是正确的,但在另一个时候null 是正确的。这是怎么回事?

【问题讨论】:

    标签: c# .net wpf command relaycommand


    【解决方案1】:

    我遇到的上下文菜单的命令谓词功能存在一些问题。这可能会帮助你 - WPF CommandParameter is NULL first time CanExecute is called

    ICommand.CanExecute being passed null even though CommandParameter is set

    【讨论】:

    • 第二个链接似乎与我遇到的问题相同。它似乎是 WPF 本身的一个错误。当commandParameternull 时,我可以通过返回false 来解决此问题,但您的里程可能会有所不同。
    • 是的。这是一个错误。我将问题简化为按钮列表。它起作用了,所以我盯着围绕该列表建立原始页面。我完全建立了它,现在它可以工作了。它与原始视图完全相同的 XAML 字符。这肯定是一个错误。我希望我有可重复的证据,我会报告它。这些是永远无法修复的错误类型。
    猜你喜欢
    • 2011-10-05
    • 2019-05-22
    • 2019-06-20
    • 2022-07-26
    • 2023-02-20
    • 1970-01-01
    • 2019-06-18
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多