我正在使用具有ViewModel的跨平台(Windows,iOS,Android).NET标准库。
在此视图模型中,我需要使用ICommand,但是我发现的所有实现都依赖于平台。我可以通过IoC容器使用它们,但是与跨平台方法相比,这是次等的解决方案。
在没有依赖于平台的代码(也没有不良实践)的情况下,有什么方法可以实现ICommand?
答案 0 :(得分:1)
Prism
和MVVM-Light
之类的库有助于减少样板代码的数量。如果您真的不想依赖它们,则可以轻松滚动自己的命令界面版本。您需要做的就是创建一个实现ICommand
接口的新类,并实现这些方法。
此article的标题为“基本”,但在这种情况下,我将其称为“基本”,因为即使使用MVVM-Light之类的库,也要了解幕后的情况,一般情况。
如果链接消失,这是ICommand
接口的基本实现。网上有一些更优雅的版本。找到自己喜欢的人,或根据自己的喜好自己做。
public class RelayCommand : ICommand
{
private Action<object> execute;
private Predicate<object> canExecute;
private event EventHandler CanExecuteChangedInternal;
public RelayCommand(Action<object> execute)
: this(execute, DefaultCanExecute)
{
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
{
throw new ArgumentNullException("execute");
}
if (canExecute == null)
{
throw new ArgumentNullException("canExecute");
}
this.execute = execute;
this.canExecute = canExecute;
}
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
this.CanExecuteChangedInternal += value;
}
remove
{
CommandManager.RequerySuggested -= value;
this.CanExecuteChangedInternal -= value;
}
}
public bool CanExecute(object parameter)
{
return this.canExecute != null && this.canExecute(parameter);
}
public void Execute(object parameter)
{
this.execute(parameter);
}
public void OnCanExecuteChanged()
{
EventHandler handler = this.CanExecuteChangedInternal;
if (handler != null)
{
//DispatcherHelper.BeginInvokeOnUIThread(() => handler.Invoke(this, EventArgs.Empty));
handler.Invoke(this, EventArgs.Empty);
}
}
public void Destroy()
{
this.canExecute = _ => false;
this.execute = _ => { return; };
}
private static bool DefaultCanExecute(object parameter)
{
return true;
}
}