我试图理解MVVM模式,因此我开始学习C#中的绑定和命令的概念。为了理解这种模式,我为代理服务器创建了一个简单的GUI。 GUI有两个按钮,一个用于启动服务器,一个用于停止服务器。
如果用户通过单击开始按钮来启动代理,我想禁用开始按钮并启用停止按钮。这样,我可以确定只有在代理运行时才能调用stop代理方法。当用户单击停止代理按钮时,我想再次启用启动代理按钮。
为了实现这一点,我创建了一个如下所示的viewmodel类:
class ViewModelBase {
public ICommand StartProxy { get; set; }
public ICommand StopProxy { get; set; }
public bool IsProxyRunning = false;
public ViewModelBase() {
StartProxy = new StartProxy(StartProxyMethod);
StopProxy = new StopProxy(StopProxyMethod);
}
private void StartProxyMethod(object Parameter) {
MessageBox.Show("Implement the start proxy method here");
IsProxyRunning = true;
}
private void StopProxyMethod(object Parameter) {
MessageBox.Show("Implement the stop proxy method here");
IsProxyRunning = false;
}
}
启动和停止代理命令的代码如下:
StartProxy
public class StartProxy : ICommand {
Action<object> StartProxyMethod;
public event EventHandler CanExecuteChanged;
public StartProxy(Action<object> StartProxyMethod) {
this.StartProxyMethod = StartProxyMethod;
}
public bool CanExecute(object Parameter) {
//How to check if the proxy is not running (if so, this method can be executed)
return true;
}
public void Execute(object Parameter) {
StartProxyMethod(Parameter);
}
}
StopProxy
public class StopProxy : ICommand {
Action<object> StopProxyMethod;
public event EventHandler CanExecuteChanged;
public StopProxy(Action<object> StopProxyMethod) {
this.StopProxyMethod = StopProxyMethod;
}
public bool CanExecute(object Parameter) {
//How to check if the proxy is running (if so, this method can be executed)
return true;
}
public void Execute(object Parameter) {
StopProxyMethod(Parameter);
}
}
现在我想知道如何实现这一目标。我以为我可以在StartProxyMethod和StopProxyMethod中(在视图模型中)传递IsProxyRunning
变量,并将变量的值委托给GUI中的按钮。但是,这没有按预期进行。
如果您对我错了,我想知道。我觉得我没有朝正确的方向提出目标。
答案 0 :(得分:1)
您可以在ViewModel中将RelayCommand用于命令属性。 在CanExecute-Method中,返回!IsProxyRunning或不返回!停下来。
答案 1 :(得分:0)
您做错了是对的。
您需要将此构造函数用于Command
(在第一部分(Action
中定义您执行的方法,在Func
中定义按钮何时可以执行) :
public Command (Action<object> execute, Func<object,bool> canExecute);
然后,您需要删除StartProxy.cs和StopProxy.cs。
最后,当按下按钮时,您需要致电:
StartProxy.ChangeCanExecute();
StopProxy.ChangeCanExecute();