Mvvm RelayCommand上的raiseCannexecutechanged()<;enum>;不';t导致调用CanExecute()

Mvvm RelayCommand上的raiseCannexecutechanged()<;enum>;不';t导致调用CanExecute(),mvvm,enums,uwp,mvvm-light,uwp-xaml,Mvvm,Enums,Uwp,Mvvm Light,Uwp Xaml,我的第一个问题来了 在使用MVVM Light的UWP应用程序中,我试图定义一个带有枚举参数的命令,以响应视图中的所有按钮交互。但是,按钮仍处于禁用状态,没有响应 我已经为命令定义了参数 公共枚举按钮 { Connect=0, 断开连接=1 } 然后由MainViewModel类使用 public类MainViewModel:ViewModelBase { 按下继电器命令按钮; 按下公共关系命令按钮 { get=>按钮按下; set=>buttonPressed=value; } 公共主视图模

我的第一个问题来了

在使用MVVM Light的UWP应用程序中,我试图定义一个带有枚举参数的命令,以响应视图中的所有按钮交互。但是,按钮仍处于禁用状态,没有响应

我已经为命令定义了参数

公共枚举按钮
{
Connect=0,
断开连接=1
}
然后由MainViewModel类使用

public类MainViewModel:ViewModelBase
{
按下继电器命令按钮;
按下公共关系命令按钮
{
get=>按钮按下;
set=>buttonPressed=value;
}
公共主视图模型()
{
buttonPressed=新的RelayCommand(buttonPressed\u Execute,buttonPressed\u CanExecute);
}
bool按钮按下按钮执行(按钮参数)
{
bool-retValue=false;
开关(arg)
{
//以下条件仅用于测试
案例按钮。连接:
retValue=true;
打破
外壳纽扣。断开:
retValue=false;
打破
}
返回值;
}
无效按钮按下执行(按钮对象)
{
//另一个switch()案例:
}
}
那么xaml代码如下所示:


连接
断开

ButtonPressed\u CanExecute(ButtonKey arg)
方法即使在
MainViewModel
构造函数中调用
ButtonPressed.raisecanecuteChanged()
也不会被调用


我认为这一切都是由用作命令参数的枚举类型引起的,但我不明白为什么。非常感谢您的帮助。

我已经检查了MvvmLight的源代码并发现了问题。在中,您将在
CanExecute
方法中找到以下检查:

if(参数==null | |参数为T)
{
返回(_canExecute.Execute((T)参数));
}
出于某种原因,该方法的enum
参数
是一个
int
,而不是执行检查时的enum实例。因此,第二次检查将失败

如果您将代码更新为使用
int
,它将按预期工作:

public RelayCommand按钮按下{get;set;}
公共主视图模型()
{
ButtonPressed=新的RelayCommand(ButtonPressed\u Execute,ButtonPressed\u CanExecute);
}
按下布尔按钮可执行(内部参数)
{
bool-retValue=false;
开关(arg)
{
//以下条件仅用于测试
案例(内部)按钮。连接:
retValue=true;
打破
外壳(内部)纽扣。断开:
retValue=false;
打破
}
返回值;
}
无效按钮按下并执行(int obj)
{
//另一个switch()案例:
}

我发现这非常令人惊讶,我想这应该作为MvvmLight中的一个bug来解决。

尝试使用x:static标记扩展设置命令参数

<AppBarButton Label="Connect" 
              Command="{Binding ButtonPressed}"
              CommandParameter="{x:Static viewModel:ButtonKey.Connect}" />


我同意马丁·齐克蒙德的建议@Oreste Riccardo Natale您可以报告此问题,您可以使用Martin Zikmund的代码作为解决方法。我今天将尝试对MvvmLight回购进行拉取请求,并进行修复:-)谢谢@Martin Zikmund,它确实有效!鉴于你的洞察力,现在我只是想知道这种行为是否真的如你所愿。正确的方法应该是使用ValueConverter from/to int和枚举类型吗?事实上,我发现枚举值显示为
int
非常令人惊讶,但我认为最好是在MvvmLight中解决这个问题,这样框架就可以处理
int
->
enum
转换,并且可以使用
enum
作为
RelayCommand
的泛型参数,并保持XAML与现在一样。
int
应该是一个临时解决方案…x:Static在UWP中不可用