在WPF中访问DataTemplate内的项

3

我在想,在WPF中是否能够获取数据模板对象的实际实例。例如,在下面的情况下:

<UserControl>
    <UserControl.Resources>
        <DataTemplate x:Key="MyTemplate">
            <CustomControl ></CustomControl>
        </DataTemplate>
    </UserControl.Resources>

    <ListBox DataTemplate="{StaticResource MyTemplate}"></ListBox>
</UserControl>

假设 CustomControl 有一个 CustomEvent 和一个公共的 CustomMethod。我想在用户控件中访问该事件和公共方法。这可能吗?我该如何做?感谢您的任何帮助。
谢谢, Nilu

@itowlson:从放置ListBox的UserControl中。当事件触发时,我想从usercontrol调用CustomControl中包含的自定义方法。 - Nilu
3个回答

5

通过VisualTree通常不是您想要的方式,而且对于这种情况存在更好的解决方案。 - Pieter Breed
我回答了关于“如何获取DataTemplate对象的实际实例”的问题。毕竟,这个问题的标题是“在WPF中访问DataTemplate内部的项”。就我所知,这是标准的做法。 - hwiechers
1
投票支持这个答案,因为当我发现这个问题时,这就是我正在寻找的答案。它可能不是最好的方法,提供替代方案也是可以的,但这并不是将明显正确的答案投票贬低的理由。 - Niall

1

我没有看到ListBox上的ItemsSource数据绑定,所以我假设您将其省略了。如果您绑定到类似ObservableCollection<>的东西,那么ListBox中的每个项目都将具有自己的ViewModel类。在这些类上,您可以有尽可能多的公共方法。

如果您希望处理自定义控件中的事件,请在最低级别的代码后端中处理它,在此示例中为UserControl的代码后端。

然后,在每个ViewModel中都有一个ICommand实例(如果适合您的目的,则为路由命令)。在UserControl中,您有一个DataContext,可以将其转换为ViewModel类型。因此,事件处理程序可以访问ViewModel并执行Commands。

这里是Josh Smith的一篇关于路由命令的文章,您可能会发现它很有趣

MVVM架构的应用程序的这篇文章中,Josh描述了自定义ICommands

(这是伪代码)

class ViewModelType {
    public void DoSomething() { /* ... */ }
    public ICommand DoSomethingCommand { get; set; }
    public string Property { get; set; }
}

class CodeBehind {
    public void EventHandler(object, args) {
        (DataContext as ViewModelType).DoSomethingElseCommand.Execute();
    }
}

0

您可以创建一个对象,将其附加到CustomControl并与其交互。

这篇博客文章介绍了一些有用的概念,我们可以进一步扩展:使用附加行为为Silverlight创建ICommand

因此,您可以创建一个类,将其附加到自定义控件,而不是附加到按钮的单击事件(在WPF中已经有一个命令)。

按照引用博客文章中的模式,您最终会得到:

<CustomControl 
  MyNamespace:CustomControlCommand.EventCommand=
  "{Binding Path=CommandHandler}" />

这将通过将它们转换为命令,使您可以访问CustomControl的事件。

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