WPF 和 Caliburn.Micro 是否可以控制我在视图中绑定的 System.Windows.Interactivity.Behavior.Behavior 的创建?
我有一种情况,我想通过
Caliburn.Micro Bootstrapper
将依赖项注入到我的自定义行为之一,但我真的不想诉诸某种服务定位器。
我的观点是这样的:
<TextBox x:Name="Output">
<i:Interaction.Behaviors>
<core:ScrollBehavior />
</i:Interaction.Behaviors>
</TextBox>
这就是我想要实现的目标:
public class ScrollBehavior : Behavior<TextBox>
{
private readonly IMyExteneralDependency _externalDependency;
public ScrollBehavior(IMyExteneralDependency externalDependency)
{
_externalDependency = externalDependency;
}
protected override void OnAttached()
{
this.AssociatedObject.TextChanged += this.OnTextChanging;
}
protected override void OnDetaching()
{
this.AssociatedObject.TextChanged -= this.OnTextChanging;
}
private void OnTextChanging(object sender, TextChangedEventArgs e)
{
this.AssociatedObject.ScrollToEnd();
}
}
有人知道我如何实现这一目标吗?
不幸的是,在这种情况下,WPF 是负责创建类的人。因此,没有直接的方法来使用构造函数注入或其他类似的技术。
因此,服务定位器是处理此类场景的常用方法。 Silverlight 甚至针对这种确切类型的场景包含了 MEF 的
CompositionInitializer
,但它从未包含在 WPF 中。我在博客中写了一个 WPF 的端口,可以在这种类型的场景中使用。
尝试像这样修改 .ctor :
public ScrollBehavior()
{
_externalDependency = IoC.Get<IMyExteneralDependency>();
}
您可以不使用 ServiceLocator,而是使用 DependencyProperty。 例如,包含 TextBlock 的 UserControl 可以声明 dep。属性启用了继承,因此在您的行为中您可以轻松分配它。 另外,为什么您不想创建属性 IMyExteneralDependency {get;set;} 并在 xaml 中分配它?它将来自您的控件构造函数。