我有这样的代码:
class CustomCell : ViewCell
{
private readonly Label _label;
public static readonly BindableProperty DataProperty = BindableProperty.Create("Data", typeof(string), typeof(CustomCell), "Data");
public string Data
{
get { return (string)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
...
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
if (BindingContext != null)
{
_label.Text = Data;
}
}
}
当我使用此代码在ListView中传递值时,它工作正常:
<customUi:CustomCell Data="{Binding Data}" />
但是,有时我希望能够从Data
本身更改CustomCell
。当我仅通过编写this.Data = "new value";
来更改它时,标签文本不会改变。我可以简单地写_label.Text = "new value";
,它有效,但它感觉不对。此外,更改Data
然后调用OnBindingContextChanged()
也感觉不对。
这样做的正确方法是什么?
答案 0 :(得分:2)
就像你创建了一个名为&#34; Data&#34;的可绑定属性一样。在你的班上该物业&#34; Text&#34; Label控件的绑定也是可绑定的。所以你可以对它应用相同的绑定,它应该按预期工作。 常见的模式是让控件的绑定上下文包含必要的属性,然后绑定各个控件的属性。 因此,不是绑定到Data属性,然后将该属性重新应用于标签,只需编辑CustomCell本身并为标签的text属性赋予相同的绑定
<Label Text="{Binding Data}" />
您甚至可以从viewmodel中获取特定对象,并将它们作为单元格的绑定上下文传递,以便单元格内的控件始终具有相同的结构来绑定到
<customUi:CustomCell BindingContext="{Binding SomeItem}" />
//Assuming SomeItem is a property inside your VM, or binding context of wherever the CustomCell is
现在将CustomCell内标签的text属性和任何其他控件的任何其他属性绑定到SomeItem的属性。
如果你真的想在视单元上创建一个可绑定属性然后只是将它传递给标签,你也可以采取任何绑定应用于&#34;数据&#34; CustomCell的属性在其属性上更改了事件,并将相同的绑定应用于标签的Text属性。虽然这不应该真的需要。
答案 1 :(得分:0)
覆盖OnPropertyChanged
方法,例如:
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == "Data")
_label.Text = Data;
}