2013-02-17 75 views
0

我刚写了一个使用wpf的小游戏。有一个我可以点击的单元矩阵。点击事件正在通过DelegateCommand进行。问题在于未调用canexecute方法。我总是必须先点击窗口的某个地方。 我,因为我是用这个从来没有与我的commandclass问题:WPF Command-Canexecute-Revalidation

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

我也试着拨打CommandManager.InvalidateRequerySuggested();但这也行不通。 如果允许单击它的当前用户是我的电脑的本地用户(它是多人游戏),单元格可以点击。所以我在从网络获得我现在是“currentplayer”的消息后,调用了InvalidateRequerySuggested。

private void SetTurn(TurnMessage message) 
{ 
    CurrentPlayer = GetPlayer(message.PlayerID); 
    System.Windows.Input.CommandManager.InvalidateRequerySuggested(); 
} 

这将有这样的影响:

public bool HasTurn 
    { 
     get { return CurrentPlayer != null && CurrentPlayer.PlayerID == Player.PlayerID; } 
    } 

我的命令能,执行这样的容貌:

private bool CanMatrixClick(Object param) 
{ 
    return Main.PlayerViewModel.HasTurn; 
} 

所以有没有人对这个问题的一个清洁,简单的解决方案? 我真的找不到任何我没有尝试过的东西。

回答

0

DelegateCommand有方法RaiseCanExecuteChanged(),你可以手动调用来触发CanExecute事件 -

private void SetTurn(TurnMessage message) 
{ 
    CurrentPlayer = GetPlayer(message.PlayerID); 
    YourCommand.RaiseCanExecuteChanged(); 
} 
+0

我也试过这样。我真的不知道为什么。我用mvvm编写了大型项目,而且这些类没有任何问题。 – 2013-02-17 21:14:03

+0

我发现了这个问题,但我没有解决方法:命令中没有CanExecuteChanged-Event的Eventhandler。如果我调用InvalidateRequerySuggested(),也没有结果。但我不知道为什么。 – 2013-02-17 21:38:53