ICommand使用方式是否正确?多按钮是否需对应独立命令?
问题背景
我在页面中设置了2个简单按钮,想咨询应当仅创建1个ICommand实例,还是当前的实现方式是合理的?
对应ViewModel实现代码如下:
internal class MainPageViewModel : INotifyPropertyChanged { public ICommand RegisterBtnClickedCommand {get; } public ICommand LoginBtnClickedCommand {get; } public MainPageViewModel() { RegisterBtnClickedCommand = new Command(RegisterButtonPressed); LoginBtnClickedCommand = new Command(LoginButtonPressed); } private void LoginButtonPressed() { Application.Current.MainPage.DisplayAlert("Login", "Login", "ok"); } private void RegisterButtonPressed() { Application.Current.MainPage.DisplayAlert("Reg", "Reg", "ok"); } public event PropertyChangedEventHandler PropertyChanged; }
额外疑问:如果页面上共有10个按钮,是否需要对应创建10个ICommand实例?
解答
你现在给两个按钮分别创建独立ICommand实例的写法完全合理,是MVVM模式下的标准实现方式,没有问题。
关于命令实例的创建,不需要刻意追求“少建实例”,按实际场景判断即可:
- 只要按钮触发的是独立的业务逻辑,就给它配单独的
ICommand实例。ICommand本身的内存开销可以忽略不计,完全没必要为了省这点资源强行复用。独立命令的好处非常明显:每个命令的逻辑互不干扰,后续要给单个按钮加可用/禁用判断(CanExecute逻辑)、加载状态控制、单独写单元测试的时候,不用在一个通用方法里堆一堆参数分支判断,代码好维护很多。 - 只有当多个按钮的执行逻辑完全是同一套,只靠按钮绑定的
CommandParameter区分具体处理分支的时候,才适合共用同一个ICommand实例。最常见的例子就是计算器的0-9数字按键,10个按键都是做数字输入动作,只是传入的参数是不同的数字,这种场景就没必要建10个命令,共用一个数字输入命令就行,靠参数判断当前按的是哪个数字,能减少很多重复代码。 - 至于10个按钮要不要建10个实例的问题,核心看逻辑是不是独立:如果10个按钮分别管登录、注册、提交、取消这类完全不相关的操作,就建10个独立命令;如果10个按钮是同构操作,比如10个商品分类的点击筛选、10个数字键输入,就可以共用命令。
内容的提问来源于stack exchange,提问作者Marcin Knapik
相关产品推荐
相关产品推荐

