通过标记扩展注入命令是一种很好的做法
本文关键字:一种 很好 扩展 注入 命令 | 更新日期: 2023-09-27 18:21:55
我有一个自定义标记扩展,它使用依赖项注入来解析命令。它对我来说非常方便,因为我不必在视图模型中为它们创建命令和绑定。最近有人告诉我,在mvvm中使用这样的标记扩展不是一个好的做法,我应该避免这种情况。这是真的吗?
标记扩展代码:
public class InjectCommandExtension : MarkupExtension
{
#region Props
[ConstructorArgument("key")]
public string Key { get; set; }
#endregion
#region ctor
public InjectCommandExtension()
{
}
public InjectCommandExtension(string key)
{
Key = key;
}
#endregion
#region ProvideValue
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (Key == null)
throw new ArgumentNullException("Key");
return ServiceLocator.Current.GetInstance<ICommand>(Key);
}
#endregion
}
在XAML中使用:
<Button Content="Delete" Command="{mext:InjectCommand DeleteOrderCommand}"/>
如果我们以这种通用的方式谈论自定义标记注入,我个人并不认为。我唯一能担心的是你应该处理的复杂性。在XAML
中标记它们可以帮助您和团队中的其他开发人员避免造成混乱。
祝你好运。
我会将它们保存在ViewModel中,这样您就可以测试命令。MVVM的主要原因是UI的可测试性。XAML的UI行为和样式以及逻辑(例如命令的执行)应该受到限制,并且应该在ViewModel中。