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 は常に null です。私は何を間違えましたか?

4

2 に答える 2

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); 
于 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 に答える