Xamarin 在ViewModel构造函数中创建ICommand有什么好处吗?

Xamarin 在ViewModel构造函数中创建ICommand有什么好处吗?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,到目前为止,我看到了两种不同的建议。我不确定它们是相同的,还是更简单、更易于使用 在构造函数中创建 public SessionViewModel() { LikeCommand = new Command(ApplyLike); } public ICommand LikeCommand {get;private set;} 在ViewModel的主体中创建 public SessionViewModel() { } private IComm

到目前为止,我看到了两种不同的建议。我不确定它们是相同的,还是更简单、更易于使用

在构造函数中创建

public SessionViewModel()   
{   
    LikeCommand = new Command(ApplyLike);   
}  
public ICommand LikeCommand {get;private set;}  
在ViewModel的主体中创建

public SessionViewModel()   
{   
}

private ICommand likeCommand;
public ICommand LikeCommand => likeCommand ?? (likeCommand = new Command(() => ApplyLike()));
第二种方法似乎更复杂,但它有优势吗?

首选下一种方法:

public ICommand LikeCommand { get; }  

public SessionViewModel()   
{   
    LikeCommand = new Command(ApplyLike);   
}
它与上面两个示例不同,因为它是一个只读自动属性。这样,
命令
将是不可变的(不可更改),换言之,这将减少混乱代码的可能性。我发现它更容易阅读和理解,因为您可以期望初始化命令的唯一位置是构造函数。

首选下一种方法:

public ICommand LikeCommand { get; }  

public SessionViewModel()   
{   
    LikeCommand = new Command(ApplyLike);   
}
它与上面两个示例不同,因为它是一个只读自动属性。这样,
命令
将是不可变的(不可更改),换言之,这将减少混乱代码的可能性。我发现它更容易阅读和理解,因为您可以期望初始化命令的唯一位置是构造函数。

相同的s。。。材料:) 尝试:

公共抽象类VmBase
{
私有只读字典映射=新字典();
受保护的ICommand RelayCommand(操作执行,函数canExecute,[CallerMemberName]字符串键=null)
{
如果(!map.ContainsKey(键))
{
Add(new/*Relay或任何ICommand impl*/命令(execute、canExecute));
}
返回映射[键];
}
}
公共类MyVm:VmBase
{
public ICommand RunSomething=>RelayCommand(()=>{/*ApplyLike代码在这里*/},()=>true);
}
这还允许您进行诸如“刷新所有命令状态”之类的交互,以及更好地对所有命令进行常规清理访问

重要注意事项:这是原型代码,不具有生产性,因为这应该包括更多检查等:)

相同的s。。。材料:) 尝试:

公共抽象类VmBase
{
私有只读字典映射=新字典();
受保护的ICommand RelayCommand(操作执行,函数canExecute,[CallerMemberName]字符串键=null)
{
如果(!map.ContainsKey(键))
{
Add(new/*Relay或任何ICommand impl*/命令(execute、canExecute));
}
返回映射[键];
}
}
公共类MyVm:VmBase
{
public ICommand RunSomething=>RelayCommand(()=>{/*ApplyLike代码在这里*/},()=>true);
}
这还允许您进行诸如“刷新所有命令状态”之类的交互,以及更好地对所有命令进行常规清理访问


重要注意事项:这是原型代码,没有生产力,因为这应该包括更多检查等:)

Xamarin.Forms中没有可用的RelayCommand,请共享代码或提及第三部分库。请使用Command而不是RelayCommand,或者使用ICommand的任何实现。Xamarin.Forms中没有可用的RelayCommand,请共享代码或提及第三部分库。请使用Command而不是RelayCommand,或者使用ICommand的任何实现。为什么不只是:public ICommand LikeCommand{get;}=new Command(ApplyLike)。。。?这也是一个选项,但有时您还需要实例化其他依赖项并将其传递给命令本身?。。。请不要破坏MVVM。。。。顺便说一句,我的解决方案将更好地满足这一需求,因为它的计算时间晚于构建期间(实际上是在第一次使用->Lazy like),比如处理字段验证等。这需要如何在ctor中实例化命令?为什么不只是:public ICommand LikeCommand{get;}=new command(ApplyLike); ...?这也是一个选项,但有时您还需要实例化其他依赖项并将其传递给命令本身?。。。请不要破坏MVVM。。。。顺便说一句,我的解决方案将更好地满足这一需求,因为它的评估时间比构建期间晚(实际上是在第一次使用->类似懒惰)例如,当你处理字段验证等问题时,这需要如何在ctor中实例化命令?字段初始值设定项在ctor的开头运行-相同的内容。字段初始值设定项在ctor的开头运行-相同的内容。