3 回答
TA贡献1794条经验 获得超8个赞
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/>
</Grid>
窗口背后的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModelBase();
}
}
ViewModel:
public class ViewModelBase
{
private ICommand _clickCommand;
public ICommand ClickCommand
{
get
{
return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), ()=> CanExecute));
}
}
public bool CanExecute
{
get
{
// check if executing is allowed, i.e., validate, check if a process is running, etc.
return true/false;
}
}
public void MyAction()
{
}
}
命令处理程序:
public class CommandHandler : ICommand
{
private Action _action;
private Func<bool> _canExecute;
/// <summary>
/// Creates instance of the command handler
/// </summary>
/// <param name="action">Action to be executed by the command</param>
/// <param name="canExecute">A bolean property to containing current permissions to execute the command</param>
public CommandHandler(Action action, Func<bool> canExecute)
{
_action = action;
_canExecute = canExecute;
}
/// <summary>
/// Wires CanExecuteChanged event
/// </summary>
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
/// <summary>
/// Forcess checking if execute is allowed
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
return _canExecute.Invoke();
}
public void Execute(object parameter)
{
_action();
}
}
我希望这会给你这个想法。
TA贡献1900条经验 获得超5个赞
ethicallogics在这里提出的解决方案就像一个魅力。只需注意一句 - 不要实现自己的CommandHandler,而应考虑使用Microsoft.Practices.Prism.Commands.DelegateCommand(实际上是相同的,除非您的按钮始终处于启用状态,否则需要额外的ctor)。
TA贡献1821条经验 获得超4个赞
要使用_canExecute,您必须实现有关此操作的通知。并且WPF内置了默认机制来重新查询CanExecute属性。但要做到这一点,你的ICommand必须重新订阅默认命令管理器,如下所示:`public event EventHandler CanExecuteChanged {add {CommandManager.RequerySuggested + = value; } remove {CommandManager.RequerySuggested - = value;
- 3 回答
- 0 关注
- 954 浏览
添加回答
举报