我可以控制行为的创建吗?

时间:2013-10-07 16:32:53

标签: c# wpf caliburn.micro

在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();
    }
}

任何人都知道如何实现这一目标?

3 个答案:

答案 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中分配它?它将来自您的控件构造函数。