2009-10-15 71 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(); 
    } 
} 
相關問題