标签TextProperty CoerceValue委托未调用

时间:2019-11-09 19:22:08

标签: xamarin.forms

我使用ReflectionLabel.TextProperty.CoerceValue设置为我的自定义委托(TextProperty.CoerceValue默认为空) 但是当标签文本更改时,不会调用该委托

Image.SourcePropertyEntry.TextProperty上应用/尝试了相同的策略 都被称为成功

设计上的错误或Label.TextProperty不会调用CoerceValue委托吗?

非常感谢您。

Xamarin.Forms 4.3.0.947036

var property = Label.TextProperty;
var coerceValue = property.GetType().GetProperty("CoerceValue", BindingFlags.NonPublic | BindingFlags.Instance);
oldDelegate = coerceValue?.GetValue(property) as BindableProperty.CoerceValueDelegate;
coerceValue?.SetValue(property, (bindable, value) => {
    var modified = ModifyValue(value); // simply modify the value if required
    return modified
});

2 个答案:

答案 0 :(得分:0)

我在 Xamarin.Forms 项目中创建了一个新页面 Page1 ,并在 代码后面 < / strong>:

public Page1()
{
    InitializeComponent();
}

protected override void OnAppearing()
{

    Label l = new Label();

    BindableProperty.CoerceValueDelegate d = (s, a) => 
    {
        string modified = "textY"; // simply modify the value if required
        return modified;
    };
    var property = Label.TextProperty;
    var coerceValue = property.GetType().GetProperty("CoerceValue", BindingFlags.NonPublic | BindingFlags.Instance);
    var oldDelegate = coerceValue?.GetValue(property) as BindableProperty.CoerceValueDelegate;
    coerceValue?.SetValue(property, d);


    l.Text = "1"; // Text property is set to textY thanks to CoerceValueDelegate!


    base.OnAppearing();
}

当我调用l.Text = "1"时,将正确调用我定义的 BindableProperty.CoerceValueDelegate ,并且按预期将l.Text设置为textY

@codetale,您可以一边运行此代码吗?

答案 1 :(得分:0)

如果要在Label.Text更改时调用CoerceValue,我建议您可以使用Bindable Properties绑定Label.TextPrperty。

public partial class Page9 : ContentPage
{
    public static readonly BindableProperty labelvalueProperty = BindableProperty.Create("labelvalue", typeof(string), typeof(Page9), null , coerceValue: CoerceValue);
    public string labelvalue
    {
        get { return (string)GetValue(labelvalueProperty); }
        set { SetValue(labelvalueProperty, value); }
    }

    private static object CoerceValue(BindableObject bindable, object value)
    {
        string str = (string)value;
        if(str=="cherry")
        {
            str = "hello world!";
        }
        return str;
    }

    public Page9 ()
    {         
        InitializeComponent ();
        label1.SetBinding(Label.TextProperty, "labelvalue");

        labelvalue = "this is test";
        BindingContext = this;
    }

    private void Btn1_Clicked(object sender, EventArgs e)
    {
        labelvalue = "cherry";
    }
}

您可以看到Label.Text属性更改时可以触发CoerceValue。