Xaml使用隐藏属性

时间:2019-06-13 11:41:55

标签: c# xaml inheritance xamarin.forms properties

我制作了一个自定义控件,该控件具有属性X-隐藏了父项的VisualElement.X属性。

public class MyCustomControl : ContentView // is a distant child of VisualElement
{
    public new double X
    {
        get { return 0; }
        set { Console.WriteLine("I was not called with: " + value); }
    }
}

我在xaml中设置了自定义控件的X

<controls:MyCustomControl X="10" />

但是这里调用Xamarin.Forms.VisualElement.X属性设置器而不是MyCustomControl.X属性设置器。为什么?以及如何使它代替我的自定义控件属性?


作为旁注。当x:Name="myCustomControlmyCustomControl.X = 10在后​​面的代码中时-MyCustomControl的setter被调用。


当声明父项中不存在的属性时:

public double AnotherX
{
    get { return 0; }
    set { Console.WriteLine("Was called with: " + value); }
}

设置器被调用。 (来自xaml)。

2 个答案:

答案 0 :(得分:3)

这是因为要通过Xaml设置VisualElement的BindableProperty'X'。 如果您还可以在自定义控件中创建BindableProperty'X',它也可以正常工作。

答案 1 :(得分:1)

  1. 您不应尝试覆盖X,而应使用新名称
  2. 您可以创建一个可绑定属性,而不仅仅是一个属性,请参阅下文,了解如何制作可绑定属性

    private readonly BindableProperty CustomXProperty = BindableProperty.Create(nameof(CustomX), typeof(double), typeof(MyCustomControl), defaultValue: 0.0);
    
    public double CustomX
    {
        get
        {
            return (double)GetValue(CustomXProperty);
        }
        set
        {
            SetValue(CustomXProperty, value);
        }
    }
    

更多信息,请参见此处https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/bindable-properties