gpt4 book ai didi

c# - RelayCommand 在某些计算机上不触发

转载 作者:行者123 更新时间:2023-11-30 18:46:38 25 4
gpt4 key购买 nike

首先,这是我在 SO 上的第一篇文章,所以要温和 ;)

我有一个非常简单的 WPF 应用程序,它有一个带有两个选项的菜单和一些位于不同 View 中的按钮,其中大部分都具有到 Microsoft.TeamFoundation.MVVM.RelayCommand 的数据绑定(bind)。在我的电脑上调试时一切正常,在运行构建的 exe 时它工作正常,在我同事的电脑上构建的版本工作正常,但是在我办公室的另一台电脑上测试时 没有这些 RelayCommands 会火...

XAML:

//Menu item
<MenuItem Header="Quit" Command="{Binding QuitCommand}" />

//Button
<Button Content="Update" Command="{Binding UpdateCommand}"
IsEnabled="{Binding Ready}" Height="30" />

C#:

//Menu item
public ICommand QuitCommand
{
get
{
return new RelayCommand(() => Quit());
}
}

//Button
public ICommand UpdateCommand
{
get
{
return new RelayCommand(() => Update());
}
}

关于计算机的一些信息:

My computer: Win8 Pro 64, .NET 4.5
My colleagues computer: Win7 Pro 64, .NET 4.5
Office computer: Win7 Pro 32, .NET 4.5

该解决方案是为目标框架 4.5 和处理器架构 x86 构建的。其他数据绑定(bind),如上面的 IsEnabled 绑定(bind)和各种文本属性,似乎工作正常。

如果我可以提供任何其他信息,请告诉我!

更新:我自己实现了 RelayCommand,效果很好:

public class RelayCommand : ICommand
{
readonly Action<object> mExecute;
readonly Predicate<object> mCanExecute;

public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");

mExecute = execute;
mCanExecute = canExecute;
}

public RelayCommand(Action<object> execute)
{
if (execute == null)
throw new ArgumentNullException("execute");

mExecute = execute;
mCanExecute = delegate { return true; };
}

public RelayCommand(Action execute)
{
if (execute == null)
throw new ArgumentNullException("execute");

mExecute = new Action<object>(param => execute());
mCanExecute = delegate { return true; };
}

public bool CanExecute(object parameter)
{
return mCanExecute == null ? true : mCanExecute(parameter);
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

public void Execute(object parameter)
{
mExecute(parameter);
}
}

我不知道我的实现与 TeamFoundation 的实现有何区别。

最佳答案

不确定这是否可以帮助您,但我遇到了类似的问题并通过在命令初始化期间显式触发 PropertyChanged 事件解决了这个问题:

base.RaisePropertyChanged("QuitCommand");

当然,只有当您有一个实现了 INotifyPropertyChanged 接口(interface)的基类时,上述方法才可用。你可以捕获它,例如来自 Josh Smith 的 MVVM Foundation框架。

完整的示例代码如下:

private ICommand _quitCommand;

//Menu item
public ICommand QuitCommand
{
get { return _quitCommand; }
private set
{
if (value == _quitCommand) return;

_quitCommand = value;
base.RaisePropertyChanged("QuitCommand");
}
}

public MyViewModel()
{
QuitCommand = new RelayCommand(() => Quit());
}

这里有趣的是,我很确定您的原始代码在一段时间前对我来说运行良好(不同的机器、环境、操作系统等)。

在特定情况下,似乎某些东西阻止了 View 类在 ViewModel 创建/启动过程中读取命令(?)属性。这需要您手动告诉 View 它应该读取目标 ViewModel 属性。

关于c# - RelayCommand 在某些计算机上不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857547/

25 4 0