2016-07-15 39 views
0

我有这样的代码:如何更改ViewCell物品值?

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}" /> 

但是,有时我想能从CustomCell本身改变Data。当我简单地通过编写this.Data = "new value";来改变它时,标签文本不会改变。我可以写简单的_label.Text = "new value";,它的工作原理,但它只是感觉不对。此外,更改Data,然后致电OnBindingContextChanged()也感觉不对。

这样做的正确方法是什么?

回答

1

就像你所创建的类被称为“数据”可绑定属性。 Label控件的属性“Text”也是可绑定的。所以你可以应用相同的绑定,它应该按预期工作。 常见模式是让您的控件的绑定上下文包含必要的属性,然后您将绑定到各个控件的属性。的 因此,而不是绑定到数据属性,然后重新申请该属性的标签,只需编辑CustomCell本身并给予结合

<Label Text="{Binding Data}" /> 

标签的文本属性与此相同的你甚至可以把特定对象从您的视图模型并通过他们作为细胞结合语境,使细胞内的控制始终具有相同的结构绑定到

<customUi:CustomCell BindingContext="{Binding SomeItem}" /> 
//Assuming SomeItem is a property inside your VM, or binding context of wherever the CustomCell is 

现在绑定标签的文本属性以及其他控制的其他任何性质的CustomCell里面SomeItem的属性。


如果你真的想上创建viewcell一个绑定属性,然后只将其穿过的标签,也可以采取任何绑定应用到CustomCell的“数据”财产上的财产更改事件并将相同的绑定应用于标签的Text属性。虽然这不应该需要真的。

+0

,例如如果数据是十进制的,我希望它以某种特定的方式显示在标签中,那么我建议我应该使用ValueConverter,对吧? – nicks

+0

这取决于你。对于我在多个地方所做的事情,我绝对使用价值转换器,是的。如果我只需要一次只需要一些东西,我可能会覆盖已更改的on属性并将值转换为该值,或者创建一个字符串类型的helper属性,以便自动转换该值。全部取决于你的喜好和你期望道具改变的频率。全局字典中的静态转换器实例是安全的选择。 – irreal

0

覆盖OnPropertyChanged方法,如:

protected override void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     base.OnPropertyChanged(propertyName); 
     if (propertyName == "Data") 
      _label.Text = Data; 
    } 
+2

虽然这会起作用,但不需要手动更新文本属性,它与原始海报已经正确声称“感觉错误”的东西没有什么不同。改为使用数据绑定。如果我需要一些格式,请参阅我的回答 – irreal