gpt4 book ai didi

mvvm - RelayCommand 上的RaiseCanExecuteChanged()不会导致CanExecute()被调用

转载 作者:行者123 更新时间:2023-12-03 10:32:57 34 4
gpt4 key购买 nike

这是我的第一个问题。

在带有MVVM Light的UWP应用程序中,我试图定义只是一个带有枚举参数的命令,以响应 View 中的所有按钮交互。但是,按钮保持禁用状态并且没有响应。

我已经为命令定义了参数

public enum ButtonKey
{
Connect = 0,
Disconnect = 1
}

然后由MainViewModel类使用

public class MainViewModel : ViewModelBase
{
RelayCommand<ButtonKey> buttonPressed;
public RelayCommand<ButtonKey> ButtonPressed
{
get => buttonPressed;
set => buttonPressed = value;
}

public MainViewModel()
{
buttonPressed = new RelayCommand<ButtonKey> (ButtonPressed_Execute, ButtonPressed_CanExecute);
}

bool ButtonPressed_CanExecute(ButtonKey arg)
{
bool retValue = false;
switch (arg)
{
// The following conditions are just for testing
case ButtonKey.Connect:
retValue = true;
break;
case ButtonKey.Disconnect:
retValue = false;
break;
}
return retValue;
}

void ButtonPressed_Execute(ButtonKey obj)
{
// another switch() case:
}
}

然后,xaml代码如下:

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

即使在 ButtonPressed_CanExecute(ButtonKey arg)构造函数中调用了 buttonPressed.RaiseCanExecuteChanged(),也不会调用 MainViewModel方法。

我认为这都是由用作命令参数的枚举类型引起的,但我不知道为什么。任何帮助将不胜感激。

最佳答案

我检查了MvvmLight的源代码并发现了问题。在 RelayCommand<T> 's source中,您会在CanExecute方法中找到以下检查:

if (parameter == null || parameter is T)
{
return (_canExecute.Execute((T)parameter));
}

由于某种原因,该方法的枚举 parameterint,而不是执行检查时枚举的实例。因此,第二次检查将失败。

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

public RelayCommand<int> ButtonPressed { get; set; }

public MainViewModel()
{
ButtonPressed = new RelayCommand<int>(ButtonPressed_Execute, ButtonPressed_CanExecute);
}

bool ButtonPressed_CanExecute(int arg)
{
bool retValue = false;
switch (arg)
{
// The following conditions are just for testing
case (int) ButtonKey.Connect:
retValue = true;
break;
case (int) ButtonKey.Disconnect:
retValue = false;
break;
}
return retValue;
}

void ButtonPressed_Execute(int obj)
{
// another switch() case:
}

我觉得这很令人惊讶,我想这应该作为MvvmLight中的错误来解决。

关于mvvm - RelayCommand <enum>上的RaiseCanExecuteChanged()不会导致CanExecute()被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215858/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com