【问题标题】:WPF: Get DataTemplate element from data context objectWPF:从数据上下文对象中获取 DataTemplate 元素
【发布时间】:2012-07-05 02:46:33
【问题描述】:

我有一个相当复杂的数据树,它显示在 WPF UserControl 中,并且该控件使用 DataTemplates 创建各种 UI 元素并将其链接到树内的各种数据。这是一个(非常)简单的示例,其中涉及显示在位于画布上的 ItemsControl 中的项目列表,并且每个元素都用 TextBox 表示:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBox
            Text="{Binding ...}"
            Canvas.Left="{Binding ...}"
            Canvas.Top="{Binding ...}"
        />
    </DataTemplate>
</ItemsControl.ItemTemplate>

现在我的 UserControl 中发生了一个事件,我引用了其中一个列表项,我想将焦点设置到它后面的 TextBox 项。有没有一种简单的方法可以从其数据上下文绑定到的数据对象中获取 TextBox 元素?还是我必须自己手动遍历整个视觉树?

我意识到我可以将一个成员放入数据元素本身并使用触发器来做我想做的任何事情,但在我的情况下,它需要一个额外的抽象层,我真的很想避免如果完全有可能。

【问题讨论】:

    标签: wpf data-binding datatemplate


    【解决方案1】:

    正如您所说,如果您不能直接将成员添加到您正在使用的项目类中,我假设它是您无权访问的内置类型,您必须创建一个适当的视图模型来访问触发器喜欢

    <Trigger Property="IsFocused" Value="True">
        <Setter TargetName="myTextBox" Property="FocusManager.FocusedElement" Value="{Binding IsTextBoxFocused}" />
    </Trigger>
    

    这是另一层抽象,但您总是会发现使用您有权访问的视图模型很重要。

    【讨论】:

    • 这真的有点可惜,因为这意味着如果您正在编写一个通用控件,并且您希望用户能够指定要绑定到哪些数据元素,那么您就不能只需直接绑定到他们的数据。控件必须在内部使用包装器封装其数据,以便它可以添加自定义数据,例如此标志。嗯,随便。谢谢你的帮助!
    • 您刚刚定义了视图模型是什么。使用它的原因是因为“生产级”控制需要更多的绑定和更复杂的行为。如果没有 View Model 将 View 与用户数据分开,将会非常混乱。
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多