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

问题描述 投票:0回答: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();
    }
}

有人知道我如何实现这一目标吗?

c# wpf caliburn.micro
3个回答
3
投票

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

因此,服务定位器是处理此类场景的常用方法。 Silverlight 甚至针对这种确切类型的场景包含了 MEF 的

CompositionInitializer
,但它从未包含在 WPF 中。我在博客中写了一个 WPF 的端口,可以在这种类型的场景中使用。


0
投票

尝试像这样修改 .ctor :

    public ScrollBehavior()
    {
        _externalDependency = IoC.Get<IMyExteneralDependency>();
    }

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.