我有一个自定义标记扩展,它使用依赖注入来解析命令。这对我来说非常方便,因为我不必在视图模型中创建命令并为它们绑定。 最近我被告知使用这样的标记扩展在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}"/>
答案 0 :(得分:0)
如果我们以这种一般方式说话,就个人看不到自定义标记注入。
我能解决的唯一问题是你应该解决的复杂问题。在XAML
中对它们进行decalred可以帮助您和该组中的其他开发人员避免造成混乱。
答案 1 :(得分:0)
我会将它们保存在ViewModel中,这样就可以测试命令。 MVVM的主要原因是UI的可测试性。应该限制XAML的UI行为,样式和逻辑(例如执行命令)应该在ViewModel中。