通过标记扩展注入命令是一个好习惯吗?

时间:2012-01-30 08:13:03

标签: c# wpf mvvm dependency-injection markup-extensions

我有一个自定义标记扩展,它使用依赖注入来解析命令。这对我来说非常方便,因为我不必在视图模型中创建命令并为它们绑定。 最近我被告知使用这样的标记扩展在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}"/>

2 个答案:

答案 0 :(得分:0)

如果我们以这种一般方式说话,就个人看不到自定义标记注入。 我能解决的唯一问题是你应该解决的复杂问题。在XAML中对它们进行decalred可以帮助您和该组中的其他开发人员避免造成混乱。

祝你好运。

答案 1 :(得分:0)

我会将它们保存在ViewModel中,这样就可以测试命令。 MVVM的主要原因是UI的可测试性。应该限制​​XAML的UI行为,样式和逻辑(例如执行命令)应该在ViewModel中。