【问题标题】:Create template-less user control. OnApplyTemplate创建无模板的用户控件。 OnApply 模板
【发布时间】:2011-11-14 20:32:26
【问题描述】:

我有不需要可视化的“服务”自定义控件。我只是将它添加到我的视图中,以便它可以绑定到 VM 并执行一些功能。

样式如下:

<Style TargetType="controls:IdattInteractions">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="controls:IdattInteractions">
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

当视图初始化时,我没有在我的控件上调用OnApplyTemplate。那是因为ControlTemplate 是空的吗?如何实现我需要的功能?我需要围绕这个控件探查视觉树以获得某些功能,并且我想在 OnApplyTemplate 内完成它。

我该怎么办?

【问题讨论】:

    标签: c# silverlight xaml mvvm


    【解决方案1】:

    据我所知,如果您的“控件”不是可视的,那么它应该是某个类的业务逻辑对象,在内存中运行并在需要时与 ViewModel 交互。无需在 XAML 中声明它。

    【讨论】:

    • 这是一个漫长的讨论,但我最终控制了我的具体情况,因为它是视觉功能的一部分。因此,它会影响视觉效果,但也会绑定到 VM 并监听事件以执行它需要执行的操作。
    • 现在在我看来,您有一个用于整个视图的虚拟机,但您需要一个逻辑后端来使该视图内的控件正常运行。在这种情况下,您应该让控件的视图模型与视图的视图模型交互。
    • 我正在尝试查看附加行为是否会这样做。似乎它可能是更清洁的解决方案
    • 去吧,但是有一个纯自然的规则——在.net 开发中,您可以在主要语言代码中实现最多,而不是在声明性 XAML 或其他一些技术部分。我理解我的意见可能非常主观,但如果代码为您提供最大的灵活性,您应该尝试在需要的任何地方坚持使用代码。但我不知道你的情况,所以在你的情况下,附加行为可能确实更好。
    • 我通过您的网站向您发送了消息 :)
    【解决方案2】:

    我猜您通过声明为资源来“将其添加到您的视图中”。如果是这种情况,您从未收到 OnApplyTemplate 调用的原因是您的控件不是可视化树的一部分。 (测试一下:在调试器中,在构造函数的末尾中断。您将拥有一个 ResourceDictionary,其中包含您的控件。尝试继续关注 Parent 属性,直到到达您的控件。您会发现 Parent 将是在层次结构中很快为 null。)

    要从 OnApplyTemplate 获得调用,您需要将自定义控件添加到其他一些控件的根布局容器中。然后您将进入可视化树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2013-09-16
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多