我使用Reflection
将Label.TextProperty.CoerceValue
设置为我的自定义委托(TextProperty.CoerceValue
默认为空)
但是当标签文本更改时,不会调用该委托
在Image.SourceProperty
,Entry.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
});
答案 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。