我在XAML中实例化一个类,并尝试通过可绑定属性初始化属性。
我注意到在构造函数运行时,这些属性还没有准备好读取。我并没有真正期待它们,但我确实希望在XAML完成处理时看到某种OnReady,我可以覆盖它。
如果我等到OnParentSet运行,那么我可以看到我的属性,但这看起来不像是保证行为。我似乎无法找到任何可以提供这种行为的其他内容。
MyPage.XAML:
<ContentPage.Content>
<StackLayout>
<local:MyClass MyVar="123">
</local:MyClass>
</StackLayout>
</ContentPage>
MyClass.xaml.cs:
public partial class MyClass : ContentView
{
public string MyVar { get { return (string)GetValue(MyClass.MyVarProperty); } set { SetValue(MyClass.MyVarProperty, value); } }
public static readonly BindableProperty MyVarProperty = BindableProperty.Create("MyVar", typeof(string), typeof(MyClass), default(string));
public MyClass() : base()
{
InitializeComponent();
Debug.WriteLine(MyVar); // null, or whatever default is
}
protected override void OnParentSet()
{
base.OnParentSet();
Debug.WriteLine(MyVar); // "123"! ... but can I rely on OnParentSet?
}
}
在从XAML设置了所有属性后,是否有某种方法可以运行代码?我甚至这样做了吗?
答案 0 :(得分:4)
我想我得到了你正在做的事情。 xaml片段实际上是更大的东西的一部分,例如:
<ContentPage ...>
<ContentPage.Content>
<local:MyClass MyVar="123" />
</ContentPage.Content>
</ContentPage>
Xaml Parser在这里做的是按顺序:
分配&#34; 123&#34;到MyVar不是构建MyClass
的过程的一部分,而是构建ContentPage
的过程的一部分。写出等效的c#代码,然后你就可以了解它。
如果要在调用MyClass.InitializeComponent()时分配123,则应将赋值作为MyClass xaml的一部分,如
<ContentView ... x:Class="MyNS.MyClass"
MyVar="123" />
</ContentView>