Как узнать, когда содержимое ContentControl загружается при изменении

У меня есть ContentControl, содержимое которого определяется DataTemplateSelector на основе свойства Workspace. Но когда шаблон данных изменен, я должен выполнить некоторые расчеты на основе начального размера ContentControl и всего окна, поэтому я хочу знать, когда он загружается.

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

Словарь ресурсов:

<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>

Выбор шаблона данных:

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;
        }
    }
}

person magol    schedule 09.12.2010    source источник
comment
Правильный способ справиться с этим — ответить на свой вопрос, а затем, через пару дней, выбрать его в качестве правильного ответа.   -  person    schedule 25.01.2011


Ответы (1)


Одна вещь, которую вы можете сделать, это обернуть содержимое вашего шаблона данных внутри контейнера и прослушать загруженное событие.

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

загруженное событие будет вызвано при переключении шаблонов. Надеюсь, это поможет.

person biju    schedule 10.12.2010
comment
Grid_Loaded должен быть в коде программной части для ResourceDictionary. Но расчеты находятся в окне, которое использует ResourceDictionary. Как мне это решить? - person magol; 10.12.2010
comment
проверьте, помогает ли это stackoverflow.com/questions/92100/ - person biju; 10.12.2010
comment
Теперь я расскажу, как добавить программный код в ResourceDictionary. Но как мне сообщить ширину родительского окна? - person magol; 10.12.2010