1

我有一个用户控件:

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

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

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

我以为我以前做过这样的事情没有任何问题,但在这种情况下 MyProperty 始终为空。我做错什么了?

4

2 回答 2

1

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

IE

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); 
于 2012-05-22T01:03:33.813 回答
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;
    }
}

如果你想在代码中设置Loaded事件,它看起来像:

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
于 2012-05-22T10:41:26.243 回答