2010-12-09 12 views
6

Ich habe ein ContentControl, dessen Inhalt von einem DataTemplateSelector basierend auf der Eigenschaft Workspace bestimmt wird. Aber wenn die Datenvorlage geändert wird, muss ich einige Berechnungen basierend auf der ursprünglichen Größe von ContentControl und dem gesamten Fenster durchführen, also möchte ich wissen, wann es geladen ist.Woher weiß ich, wann der Inhalt von ContentControl beim Ändern geladen wird?

<ContentControl Content="{Binding Path=Workspace}" ContentTemplateSelector="{StaticResource workspaceTemplateSelector}" /> 

Resource:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:vw="clr-namespace:Capgemini.Sag.KeyEm.View"> 

    <DataTemplate x:Key="keyboardTemplate" > 
     <vw:Keyboard/> 
    </DataTemplate> 

    <DataTemplate x:Key="welcomeTemplate"> 
     <vw:Welcome/> 
    </DataTemplate> 

    <vw:WorkspaceTemplateSelector    
     KeyboardTemplate="{StaticResource keyboardTemplate}"    
     WelcomeTemplate="{StaticResource welcomeTemplate}"   
     x:Key="workspaceTemplateSelector"/> 
</ResourceDictionary> 

Datatemplateselector:

using Capgemini.Sag.KeyEm.ViewModel.Interfaces; 

namespace Capgemini.Sag.KeyEm.View 
{ 
    using System.Windows; 
    using System.Windows.Controls; 

    class WorkspaceTemplateSelector : DataTemplateSelector 
    { 
     public DataTemplate WelcomeTemplate { get; set; } 
     public DataTemplate KeyboardTemplate { get; set; } 

     public override DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 
      if (item is IWelcomeViewModel) 
       return WelcomeTemplate; 
      if (item is IKeyboardViewModel) 
       return KeyboardTemplate; 
      return null; 
     } 
    } 
} 
+0

Der richtige Weg, um damit umzugehen, ist Ihre eigene Frage zu beantworten und dann, ein paar Tage später, wählen Sie es als die richtige Antwort. – Will

Antwort

0

Eine Sache, die Sie tun können, ist Ihr Datatemplate Inhalt in einem Container wickeln und hören auf die geladene Ereignis

<DataTemplate x:Key="keyboardTemplate"> 
     <Grid Loaded="Grid_Loaded"> 
      <vw:Welcome/> 
     </Grid> 
    </DataTemplate> 

Das geladene Ereignis wird ausgelöst, wenn die Vorlagen umgeschaltet werden.

+0

Grid_Loaded muss im Code-Behind für das ResourceDictionary sein. Aber die Berechnungen sind in dem Fenster, das das ResourceDictionary verwendet. Wie löse ich das? – magol

+0

überprüfen, ob dies hilft http://stackoverflow.com/questions/92100/is-it-possible-to-set-code-behind-a-resource-dictionary-in-wpf-for-event-handling – biju

+0

ich jetzt wie Hinzufügen eines Code-Behind zum ResourceDictionary. Aber wie kommuniziere ich die Breite des Elternfensters? – magol

Verwandte Themen