我能控制行为的创建吗?

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

有人知道我如何实现这个吗?

3个回答

3
很遗憾,在这种情况下,WPF负责创建类。 因此,没有直接使用构造函数注入或其他类似技术的方法。
因此,服务定位器是处理这种情况的常见方法。 Silverlight甚至包括MEF的 CompositionInitializer 来处理这种情况,但它从未包含在WPF中。 我为WPF写了一个端口,可用于这种类型的场景。

太遗憾了。我本来想避免使用服务定位器,但看来我别无选择。感谢您抽出时间回答我的问题。 - Patrik Svensson
@Patrik 是的,问题在于你无法控制实例化 - 它发生在 WPF 的内部,因此没有其他正确注入的方法 :( - Reed Copsey

0
尝试像这样修改 .ctor:
    public ScrollBehavior()
    {
        _externalDependency = IoC.Get<IMyExteneralDependency>();
    }

谢谢你的回答,但这正是我不想做的。还是谢谢。 - Patrik Svensson

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接