通过标记扩展注入命令是一种很好的做法

本文关键字:一种 很好 扩展 注入 命令 | 更新日期: 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中。