为什么我的Silverlight usercontrol属性为null?

时间:2012-05-21 23:15:06

标签: silverlight

我有一个usercontrol:

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Name="TextBlock1" Text="Text for"></TextBlock> 
    </Grid>

它有一个cs文件:

public partial class MyUserControl: UserControl
{
    public string MyProperty { get; set; }

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

    private void DoSomething()
    {
        TextBlock1.Text = TextBlock1.Text + MyProperty;
    }
}

我正在尝试以编程方式将此usercontrol添加到另一个用户控件:

            UserControls.MyUserControl myUserControl = new UserControls.MyUserControl();
            myUserControl.MyProperty = "Something";
            MyStackPanel.Children.Add(myUserControl);

我以为我之前做过类似的事情没有任何问题,但在这种情况下,MyProperty总是为空。我做错了什么?

2 个答案:

答案 0 :(得分:1)

发生的事情是,在设置DoSomething之前,您在构造函数中调用了MyProperty,因此MyProperty等于null。如果您希望在创建UserControl时数据存在,您可以在构造函数中设置它。

public partial class MyUserControl : UserControl
{
    public string MyProperty { get; set; }

    public MyUserControl()   //Default Constructor
    {
        InitializeComponent();
    }

    public MyUserControl(string MyData)
    {
        InitializeComponent();
        MyProperty = MyData;
        DoSomething();
    }
    private void DoSomething()
    {
        TextBlock1.Text = TextBlock1.Text + MyProperty;
    }

}

并像这样创建它。

MyUserControl myUserControl = new MyUserControl(" Something");
MyStackPanel.Children.Add(myUserControl); 

答案 1 :(得分:1)

除了拨打DoSomething()时,您的代码一直很好。您应该在控件的构造函数中避免 GUI交互,原因有很多(其中最重要的是您的属性尚未按Mark Hall指出的那样设置)。 但我不建议添加不同的构造函数来获取初始属性

您只想将该调用推迟到控件的Loaded事件。

假设您在Xaml中设置事件,如下所示:

<navigation:Page x:Class="MyUserControl" 
    ...
    Loaded="Page_Loaded">

您的代码如下:

public partial class MyUserControl: UserControl
{
    public string MyProperty { get; set; }

    public MyUserControl()
    {
        InitializeComponent();
    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
       DoSomething();
    }

    private void DoSomething()
    {
        TextBlock1.Text = TextBlock1.Text + MyProperty;
    }
}

如果要在代码中设置已加载事件,它将如下所示:

public partial class MyUserControl: UserControl
{
    public string MyProperty { get; set; }

    public MyUserControl()
    {
        InitializeComponent();
        Loaded += Page_Loaded; 
    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
       DoSomething();
    }

    private void DoSomething()
    {
        TextBlock1.Text = TextBlock1.Text + MyProperty;
    }
}

您可以在构建之后设置所有需要的属性,但在页面加载之前就已经完成了。

UserControls.MyUserControl myUserControl = new UserControls.MyUserControl();
myUserControl.MyProperty = "Something";
MyStackPanel.Children.Add(myUserControl); // This makes it visible when Loaded event is called