3

是否可以在 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();
    }
}

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

4

3 回答 3

3

不幸的是,在这种情况下,WPF 是负责创建类的。因此,没有直接的方法来使用构造函数注入或其他类似技术。

因此,服务定位器是处理此类场景的常用方法。Silverlight 甚至CompositionInitializer为这种确切类型的场景包含了 MEF,但它从未包含在 WPF 中。我为 WPF 写了一个端口,可以在这种类型的场景中使用。

于 2013-10-07T16:41:34.110 回答
0

尝试像这样修改 .ctor:

    public ScrollBehavior()
    {
        _externalDependency = IoC.Get<IMyExteneralDependency>();
    }
于 2013-10-07T16:43:01.713 回答
0

您可以不使用 ServiceLocator 而是使用 DependencyProperty。例如,包含 TextBlock 的 UserControl 可以声明 dep. 启用继承的属性,因此在您的行为中您可以轻松地分配它。另外,你为什么不想创建属性 IMyExteneralDependency {get;set;} 并在 xaml 中分配它?它将来自您的控件构造函数。

于 2013-10-07T17:02:29.110 回答