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

相關問題