我有一个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总是为空。我做错了什么?
答案 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事件。
<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