为什么我的通用列表在运行时在XAML中填充为空?

时间:2010-02-16 20:46:31

标签: c# .net silverlight generics xaml

所有

我在自定义用户控件中定义了一个通用列表。

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 个答案:

答案 0 :(得分:4)

加载控件后调用DoSomething(等待Loaded事件)。在通过XAML设置AnimationNames属性之前,您在构造函数中调用它:

public AnimatedCharacter() 
{ 
    InitializeComponent();                         

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

private void OnLoaded(object sender, RoutedEventArgs e)
{
     this.DoSomething();
}

答案 1 :(得分:4)

迈克尔有解决方案,但让我解释一下发生了什么。

当Xaml解析器到达Xaml的这一部分时: -

 <local:AnimatedCharacter

它构造了一个AnimatedCharacter的新实例,其中包含其构造函数的执行,InitialiseComponent以及构造函数中的其他任何内容。当然,在这一点上,没有任何属性被解析并分配给适当的属性,并且Xaml中的子内容尚未被解析并添加到List中。

当读取了控件的整个Xaml并且控件已添加到可视树中时,将触发Loaded事件。因此,如果您需要使用加载的List,则需要在Loaded事件处理程序中执行此操作,而不是在构造函数中。