为xamarin.forms中的自定义控件自定义HeightRequest的BindableProperty

时间:2017-09-22 03:48:18

标签: properties xamarin.forms bindable

我为wrappanel创建了一个自定义控件。但它显示了额外的空间。 所以我试图创建HeightRequest的BindableProperty用于控制,并根据内容设置它以删除额外的空间。

这就是我如何创建HeightRequest的BindableProperty

    public double HeightRequest { get; set; }

    private static BindableProperty heightTextProperty = BindableProperty.Create(
                                                     propertyName: "HeightRequest",
                                                     returnType: typeof(double),
                                                     declaringType: typeof(InstallationPhotoWrappanel),
                                                     defaultValue: 100,
                                                     defaultBindingMode: BindingMode.TwoWay,
                                                     propertyChanged: heightTextPropertyChanged);

    private static void heightTextPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var control = (InstallationPhotoWrappanel)bindable;
        control.HeightRequest = Convert.ToDouble(newValue);
    }

但它给了我异常

exception has been thrown by the target of an invocation

我在这里做错了什么。请帮助。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的自定义控件应该已经有HeightRequest属性。我假设您正在创建名为HeightText的自定义可绑定属性。

如果是这样,我可以在代码中看到三个问题:

  1. propertyName: "HeightRequest"应为propertyName: "HeightText"

  2. 为确保我们不会获得目标媒体资源类型不匹配的例外,请将defaultValue: 100更改为defaultValue: (double)100

  3. 使用HeightTextGetValue

    添加SetValue媒体资源
    public double HeightText
    {
        get
        {
            return (double)GetValue(HeightTextProperty);
        }
        set
        {
            SetValue(HeightTextProperty, value);
        }
    }
    

答案 1 :(得分:0)

请看下面的代码并试一试。希望,它会帮助你。

代码

public static readonly BindableProperty HeightRequestProperty =
    BindableProperty.Create<InstallationPhotoWrappanel,double>(i=>i.HeightRequest,100,BindingMode.TwoWay,heightTextPropertyChanged);

public double HeightRequest
{
    get
    {
        return (double)GetValue(HeightRequestProperty);
    }
    set
    {
        SetValue(HeightRequestProperty, value);
    }
}

static bool heightTextPropertyChanged(BindableObject bindable, double value)
{
    var control = (InstallationPhotoWrappanel)bindable;
    control.HeightRequest = value;
    return true;
}