2011-09-20 91 views
0

这种情况您可以自己测试: 微软文档指定当初始化事件被触发时,所有属性都被设置(绑定除外) 如果你创建一个新的用户控件,并在代码隐藏文件中定义一个简单的字符串属性,然后将这个新控件放在一个页面上并在那里设置该属性,当初始化事件在用户控件上触发时,该属性将不会被设置。 ,这是什么解决办法除了使用加载的事件(不能这样做,因为我只是在内存中创建控件而不显示他们WPF UserControl在设置Notmal属性之前初始化事件触发

下面是用户控件的代码:

Public Class UserControl1 

Private _Test As String 
Public Property test() As String 
    Get 
     Return _Test 
    End Get 
    Set(ByVal value As String) 
     _Test = value 
    End Set 
End Property 

Public Sub New() 

    ' This call is required by the designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 

End Sub 

Protected Overrides Sub OnInitialized(ByVal e As System.EventArgs) 
    'MyBase.OnInitialized(e) 
    Debug.Write(_Test) 
End Sub 

Private Sub UserControl_Initialized(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Initialized 
    Dim parent As FrameworkElement = Me.Parent 
    parent = LogicalTreeHelper.GetParent(Me) 
End Sub 

End Class 

回答

0

我想知道为什么你评论出MyBase.OnInitialized(e)

你想做的是通过XAML设置一个子元素的属性我相信MSDN文章是说当前UserControl的属性(如果设置在XAML中)将在调用InitializeComponent期间设置。

在UserControl的构造函数中调用InitializeComponent。在设置任何属性之前,父元素(你的页面)必须创建UserControl,并因此导致构造函数运行。

如果您希望在设置属性时通知您的孩子,只需将代码添加到该属性设置器。

另一个选项可能是在父节点完全加载后调用子节点上的子节点。

+0

因此,OnInitialized评论只是针对我尝试过的一些测试,它不适用于评论或不评论。 – Rdn

+0

关于InitializeComponent还有其他的东西......确实会在UserControl的构造函数中调用,因此将设置用户控件的XAML页面内的所有属性。但是在显示用户控件的页面上设置的那些不会。因此,在我设定这些属性之后,提出初始化事件似乎是显而易见的,但这不会发生。初始化确实在UserControl的构造函数存在之前调用,这意味着即使在UserControl的构造函数中的InitializedComponent之后的代码也不会被调用。 – Rdn

+0

从父母调用一个自定义初始化子的建议不是没有它自己的问题......你将不得不循环页面中的所有控件来做到这一点......如果你有很多,这可能是一个性能问题。 .. – Rdn