2013-01-15 129 views
3

我有一個自定義控件,它有一個名爲ViewModel的依賴屬性,其值顯示在ContentPresenter內。對於每種類型的ViewModel,我有一個DataTemplate。每個模板都允許用戶以不同的方式進行選擇,並且我需要在後面的自定義控制代碼中處理該選擇事件。如何處理WPF DataTemplate中的事件?

<Style TargetType="{x:Type local:MyCustomControl}"> 

    <Style.Resources> 
     <ResourceDictionary> 

      <DataTemplate DataType="{x:Type local:ViewModelOne}"> 

       <!-- how to handle this event? --> 
       <ListBox 
        MouseDoubleClick="ListBox_MouseDoubleClick"/> 
      </DataTemplate> 

      <DataTemplate DataType="{x:Type local:ViewModelTwo}"> 

       <!-- this ListBox has another style, but event should 
        be handled the same way --> 
       <ListBox 
        MouseDoubleClick="ListBox_MouseDoubleClick"/> 
      </DataTemplate> 

      <!-- more templates here --> 

     </ResourceDictionary> 
    </Style.Resources> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
       <ContentPresenter Content="{TemplateBinding ViewModel}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

編輯:

這裏與我想的方法自定義控件背後的代碼被調用時什麼東西在ListBox被雙擊:

public class MyCustomControl : Control 
{ 
    // how to attach ListBox MouseDoubleClick event to this method? 
    private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     DoMagic(((ListBox)sender).SelectedItem); 
    } 
} 
+0

得到了同樣的問題的代碼。你能發佈你的實際解決方案嗎? –

回答

0

這些是數據模板在資源字典中定義?

如果是這樣,您可以使用attached behaviors

如果他們是在爲mywindow或XAML的MyUserControl定義,那麼你可以定義他們身後即MyWindow.xaml.csMyUserControl.xaml.cs

+0

DataTemplates在屬於自定義控件的樣式中的ResourceDictionary中定義。但是,如果添加一個掛鉤在'MouseDoubleClick'事件上的附加行爲,我如何(在事件處理程序中)將所選項目移動到後面的自定義控制代碼? – Mizipzor

+0

'MouseDoubleClick'事件是什麼? 'ListBoxItem'?那麼你已經選擇它不是?如果你正在處理'ListBox.MouseDoubleClickEvent'然後使用'((ListBox)sender).SelectedItem'會給你所有你需要的。 –

+0

是的,我在後面的代碼中使用發件人的'SelectedItem'。我的問題是,XAML無法找到代碼後面的事件處理程序。我認爲這是因爲'DataTemplate'與自定義控件背後的代碼沒有直接關係。 – Mizipzor