2010-12-09 17 views
6

Tengo un ContentControl cuyo contenido está determinado por un DataTemplateSelector basado en el área de trabajo de la propiedad. Pero cuando se cambia la plantilla de datos, debo hacer algunos cálculos basados ​​en el tamaño inicial de ContentControl y toda la ventana, por lo que quiero saber cuándo está cargada.¿Cómo puedo saber cuándo se carga el contenido de ContentControl al cambiar

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

ResourceDictionary:

<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

La forma correcta de manejar esto es responder su propia pregunta y luego, un par de días después, seleccionarla como la respuesta correcta. – Will

Respuesta

0

Una cosa que puede hacer es envolver su contenido DataTemplate dentro de un contenedor y escuchar el evento cargado

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

el evento cargado se generará cuando se cambien las plantillas. Espero que esto ayude.

+0

Grid_Loaded tiene que estar en el código subyacente para ResourceDictionary. Pero los cálculos están en la ventana que usa ResourceDictionary. ¿Cómo lo soluciono? – magol

+0

compruebe si esto ayuda http://stackoverflow.com/questions/92100/is-it-possible-to-set-code-behind-a-resource-dictionary-in-wpf-for-event-handling – biju

+0

Ahora cómo para agregar un código detrás de ResourceDictionary. Pero, ¿cómo comunico el ancho de la ventana principal? – magol

Cuestiones relacionadas