2009-10-15 52 views
3

我想知道是否在WPF中可以获取数据模板对象的实际实例。例如,在以下情况:访问WPF中的DataTemplate内的项目

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

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

假设CustomControlCustomEvent和公共CustomMethod。我想访问该事件和用户控件中的公共方法。这可能吗?我将如何能够做到这一点?预先感谢您的帮助。

干杯,

尼鲁

+0

从那里访问它们? – itowlson 2009-10-15 22:50:13

+0

@itowlson:来自放置ListBox的UserControl。我想在触发事件时从usercontrol调用自定义方法(包含在CustomControl中)。 – Nilu 2009-10-16 06:59:53

回答

0

您可以创建附加到CustomControl并与之交互的对象。

此博文在这里说明,我们可以根据扩大一些有用的概念:ICommand for Silverlight with Attached Behaviors

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

继引用的博客文章的方式,你最终会:

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

这将使你通过把他们变成命令进入到CustomControl的事件。

5

你需要找到ContentPresenter拿着列表框(通过导航的VisualTree),然后使用

myDataTemplate.FindName("myCustomControl", myListBox); 

有MSDN上的例子:http://msdn.microsoft.com/en-us/library/bb613579.aspx

+0

通过VisualTree通常不是你想要的,并且存在更好的解决方案 – 2009-10-16 07:08:52

+0

我回答了问题“[如何]获取数据模板对象的实际实例”。毕竟,问题的标题是“访问WPF中的DataTemplate内部的项目”。据我所知,这是做这件事的标准方法。 – hwiechers 2009-10-16 07:31:45

+0

投这个答案,因为这是我发现这个问题时寻找的答案。这可能不是最好的方法,可以提供替代品,但是没有理由对投票问题明确表示正确的答案。 – Niall 2009-12-14 03:30:41

0

我没有看到ListBox上的ItemsSource数据绑定,所以我假设你没有看到它。如果你绑定到像ObservableCollection <>那么ListBox中的每个项目都会有它自己的ViewModel类。您可以尽可能多地使用公共方法。

如果您想要处理自定义控件中的事件,请在最低级别的代码隐藏处理中进行处理,在此情况下可以在UserControl的代码隐藏处理中进行处理。

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

这里是Josh Smith's article on Routed Commands,你可能会发现有趣的

在这篇文章上Apps with MVVM architecture,乔什描述定制个ICommand

(这是伪代码)

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(); 
    } 
} 
相关问题