2011-01-13 7 views
3

Ich habe ein DataTemplate mit einem ListView-Steuerelement. Diese DataTemplate befindet sich in Templates.xaml (ein ResourceDictionary). Template.xaml wird dann in ResourceDictionary.MergedDictionaries in mein Hauptbenutzersteuerelement SourceManager.xaml eingefügt. Ich möchte das SelectionChanged-Ereignis der ListView der DataTemplate auslösen, aber ich möchte, dass der Handler in dem Code hinter SourceManager.xaml.cs ist.WPF: Wie gehe ich mit Ereignissen in einer DataTemplate um, die sich in einer separaten Datei befindet?

Wie kann ich das erreichen?

Templates.xaml:

<ResourceDictionary x:Class="LawBib.Templates" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<DataTemplate x:Key="SectionTemplate"> 
    <StackPanel> 
     <TextBlock Text="{Binding [email protected]}" /> 
     <ListView x:Name="GroupList" ItemsSource="{Binding XPath=Source}"> 
      <ListView.Template> 
       <ControlTemplate> 
        <WrapPanel IsItemsHost="True"> 

        </WrapPanel> 
       </ControlTemplate> 
      </ListView.Template> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <Image Source="images/source.png" /> 
         <TextBlock Text="{Binding [email protected]}" HorizontalAlignment="Center" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackPanel> 
</DataTemplate> 

SourceManager.xaml:

<UserControl x:Class="LawBib.SourceManager" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" Background="#f5f7f8"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Resources.xaml" /> 
       <ResourceDictionary Source="Templates.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 
... 
</UserControl> 

Antwort

0

Seit SelectionChanged ist ein RoutedEvent, können Sie es zu Ihrem UserControl wie so anwenden können:

<UserControl ... 
      ListView.SelectionChanged="MyEventHandler" /> 

Beachten Sie, dass dieser Event-Handler für alleSelector abgeleiteten Klassen aufgerufen werden (wie Selector ist, wo das Ereignis definiert ist und angehoben), die Nachkommen des UserControl, die ComboBox umfasst, Menu, ListBox usw.

+0

Vielen Dank für Ihre Antwort, aber diese Lösung scheint ein bisschen chaotisch, da alle von Selektoren abgeleiteten Klassen diesen Handler treffen werden. Gibt es eine andere Art und Weise? – Mike

+0

Sie könnten Ihrem ResourceDictionary einen Code-Behind hinzufügen und Ereignishandler hinzufügen, wie Sie es in UserControl tun würden. Wenn Sie das tun, werden die Ereignishandler in dem Code-behind des ResourceDictionary und nicht in Ihren Benutzersteuerelementen aufgerufen. –

+0

Ja, aber ich brauche die Handler im UserControl-Code hinter ... Das ist der ganze Grund für diese Frage. – Mike

-1

Erstellen Sie ein Verhalten

Lassen Sie es in der Datenvorlage.

das ist es.

+0

Ich glaube nicht, dass ein Verhalten ist, was ich in diesem Fall brauche. – Mike