Почему мой общий список, заполненный в XAML, пуст во время выполнения? - PullRequest
3 голосов
/ 16 февраля 2010

All

У меня есть общий список, определенный в пользовательском элементе управления.

private List<string> m_AnimationNames = new List<string>();

public List<string> AnimationNames
        {
            get { return this.m_AnimationNames; }
            set { this.m_AnimationNames = value; }
        }

Я ссылаюсь на этот список в xaml и заполняю его следующим образом.

<local:AnimatedCharacter.AnimationNames>
        <System:String>Walk</System:String>
        <System:String>Run</System:String>
        <System:String>Talk</System:String>
</local:AnimatedCharacter.AnimationNames>

Затем я пытаюсь ссылаться на этот список в другом месте кода, после вызова InitializeComponent (), и список всегда возвращает размер 0 и не содержит элементов.

Почему этот список пуст во время выполнения? Чего мне не хватает, что делает этот список счетчиком 0 при доступе к нему в коде?

Полный класс:

public partial class AnimatedCharacter : UserControl
    {

        private List<string> m_AnimationNames = new List<string>();



        public AnimatedCharacter()
        {
            InitializeComponent();                        
            DoSomething();
        }


        public List<string> AnimationNames
        {
            get { return this.m_AnimationNames; }
            set { this.m_AnimationNames = value; }
        }


        public void DoSomething(){
            Console.WriteLine("Anim: " + AnimationNames.Count);   
        }
    }
}

Экземпляр XAML:

<local:AnimatedCharacter x:Name="ac_guy1" Height="315" Width="273" Canvas.Left="-666" Canvas.Top="-99" >            
            <local:AnimatedCharacter.AnimationNames>
                <System:String>Walk</System:String>
                <System:String>Run</System:String>
                <System:String>Talk</System:String>
            </local:AnimatedCharacter.AnimationNames>

</local:AnimatedCharacter>

Ответы [ 2 ]

4 голосов
/ 17 февраля 2010

У Майкла есть решение, но позвольте мне объяснить, что происходит.

Когда синтаксический анализатор Xaml достигает этой части Xaml: -

 <local:AnimatedCharacter

Он создает новый экземпляр AnimatedCharacter, который включает в себя выполнение его конструктора, InitialiseComponent и все остальное, что находится в конструкторе. Конечно, в этот момент ни один из атрибутов не был проанализирован и назначен соответствующим свойствам, а также дочернее содержимое в Xaml не было проанализировано и добавлено в Список.

Событие Loaded возникает, когда весь Xaml для элемента управления прочитан и элемент управления добавлен в визуальное дерево. Следовательно, если вам нужно работать с загруженным List, вам нужно сделать это в обработчике Loaded, а не в конструкторе.

4 голосов
/ 17 февраля 2010

Вызовите DoSomething после загрузки элемента управления (дождитесь события Loaded). Вы вызываете его в конструкторе до того, как свойство AnimationNames было установлено через XAML:

public AnimatedCharacter() 
{ 
    InitializeComponent();                         

    this.Loaded += new RoutedEventHandler(OnLoaded);
} 

private void OnLoaded(object sender, RoutedEventArgs e)
{
     this.DoSomething();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...