2010-12-09 85 views
6

我有一个ContentControl,其内容由DataTemplateSelector根据属性Workspace确定。但是当数据模板发生变化时,我必须根据ContentControl的初始大小和整个窗口进行一些计算,所以我想知道它何时加载。我如何知道ContentControl的内容在更改时何时加载

<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

处理此问题的正确方法是回答自己的问题,然后几天后选择该问题作为正确答案。 – Will 2011-01-25 14:03:06

回答

0

一件事是换你的DataTemplate内容的容器内,并听取了加载事件

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

加载的事件将在模板切换时引发。希望这会有所帮助。

+0

Grid_Loaded必须位于ResourceDictionary的代码隐藏中。但是计算在使用ResourceDictionary的窗口中。我如何解决这个问题? – magol 2010-12-10 11:54:13

相关问题