在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();
}
}
任何人都知道如何实现这一目标?
答案 0 :(得分:3)
不幸的是,在这种情况下,WPF是负责创建类的人。因此,没有直接的方法来使用构造函数注入或其他类似的技术。
因此,服务定位器是处理此类场景的常用方法。对于这种确切类型的场景,Silverlight甚至包括MEF的CompositionInitializer
,但它从未被包含在WPF中。我在博客上写了port for WPF,可以在这种情况下使用。
答案 1 :(得分:0)
尝试修改.ctor,如下所示:
public ScrollBehavior()
{
_externalDependency = IoC.Get<IMyExteneralDependency>();
}
答案 2 :(得分:0)
您可能不使用ServiceLocator,而是使用DependencyProperty。 例如,包含TextBlock的UserControl可以声明dep。启用了Inherits的属性,因此在您的行为中您可以轻松地分配它。 另外,为什么你不想创建属性IMyExteneralDependency {get; set;}并在xaml中分配它?它将来自您的控件构造函数。