WPF:从数据上下文对象获取DataTemplate元素

4

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

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

现在我的UserControl中发生了一个事件,我可以引用其中一个列表项并希望将焦点设置到其后面的TextBox项目。有没有一种简单的方法从数据上下文绑定的数据对象中获取TextBox元素?还是我必须手动遍历整个可视化树?我知道我可以在数据元素本身内部放置一个成员并使用触发器来完成我正在尝试做的任何操作,但在我的情况下,这将需要一层额外的抽象,如果可能的话,我真的希望避免。
1个回答

2

正如您所说,如果您无法直接向您使用的项类添加成员,我假设它是一个您无法访问的内置类型,那么您必须创建一个适当的视图模型来访问触发器,例如:

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

这是另一层抽象,但你会发现使用你可以访问的视图模型非常重要。


有点遗憾,因为这意味着如果你正在编写一个通用控件,并且希望用户能够指定要绑定到哪些数据元素,那么你不能直接绑定到他们的数据。控件必须使用包装器在内部封装他们的数据,以便可以添加自定义数据,例如此标志。嗯,无论如何,感谢您的帮助! - Mark Feldman
你刚刚定义了什么是视图模型。使用它的原因是因为“生产级”控件需要更多的绑定和更复杂的行为。如果没有视图模型来将视图与用户数据分离,那么会非常混乱。 - jimmyjambles

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