我的BindableProperties何时可以阅读?

时间:2017-01-18 14:46:23

标签: c# xaml xamarin.forms

我在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设置了所有属性后,是否有某种方法可以运行代码?我甚至这样做了吗?

1 个答案:

答案 0 :(得分:4)

我想我得到了你正在做的事情。 xaml片段实际上是更大的东西的一部分,例如:

<ContentPage ...>
   <ContentPage.Content>
       <local:MyClass MyVar="123" />
   </ContentPage.Content>
</ContentPage>

Xaml Parser在这里做的是按顺序:

  • 实例化MyClass
  • 将123分配给MyClass实例的BindableProperty MyVarProperty
  • 将MyClass实例分配给Page.Content

分配&#34; 123&#34;到MyVar不是构建MyClass的过程的一部分,而是构建ContentPage的过程的一部分。写出等效的c#代码,然后你就可以了解它。

如果要在调用MyClass.InitializeComponent()时分配123,则应将赋值作为MyClass xaml的一部分,如

<ContentView ... x:Class="MyNS.MyClass"
    MyVar="123" />
</ContentView>