2014-09-26 99 views
0

我的MainPage中有一個Textblock項,它綁定了一個myClass對象的值。我也有一個改變這個對象的屬性值的按鈕。雖然在點擊按鈕並實現接口時更新值,但所表示的值不會改變。這裏是我的代碼:Windows Phone:數據綁定不會更新接口中的值

public class myClass : INotifyPropertyChanged 
{ 
    //Fields declaration <----------------------------------------------------> 

    private int lifetime; 
    private DateTime startingDate; 
    private string brand; 
    private double power; 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    public int Lifetime { 
     get 
     { 
      return lifetime; 
     } 
     set 
     { 
      if (value != lifetime) 
      { 
       lifetime = value; 
       NotifyPropertyChanged("Lifetime"); 
      } 

     } 
    } 

    public DateTime StartingDate { 
     get 
     { 
      return startingDate; 
     } 
     set 
     { 
      if (value != startingDate) 
      { 
       startingDate = value; 
       NotifyPropertyChanged("StartingDate"); 
      } 
     } 
    } 

    public string Brand 
    { 
     get 
     { 
      return brand; 
     } 
     set 
     { 
      if (value != brand) 
      { 
       brand = value; 
       NotifyPropertyChanged("Brand"); 
      } 
     } 
    } 

    public double Power 
    { 
     get 
     { 
      return power; 
     } 
     set 
     { 
      if (value != power) 
      { 
       power = value; 
       NotifyPropertyChanged("Power"); 
      } 
     } 
    } 

    public int DaysRemaining 
    { 
     get 
     { 
      return Lifetime - (DateTime.Now - StartingDate).Days; 
     } 
    } 

    //Functions declaration <------------------------------------------------> 

    public ContactLens() 
    { 
     StartingDate = new DateTime(); 
    } 


} 

和改變startingDate價值,並因此應改變DaysRemaining值太大按鈕功能。

private void leftButtonChange_Click(object sender, RoutedEventArgs e) 
    { 
     Model.Left.StartingDate = DateTime.Now; 


    } 

    private void rightChangeButton_Click(object sender, RoutedEventArgs e) 
    { 
     Model.Right.StartingDate = DateTime.Now; 

    } 

編輯: 我創建了更新日期和計算再次DaysRemaining但仍然是一個方法,但綁定到StartingDate變化的文本塊看重DaysRemaining值要求的應用程序的重新啓動進行更改:

private void leftButtonChange_Click(object sender,RoutedEventArgs e) { Model.Left.Replace();
}

private void rightChangeButton_Click(object sender, RoutedEventArgs e) 
    { 
     Model.Right.Replace(); 
    } 

和主類功能:

public void Replace() 
    { 
     MessageBox.Show("" + daysRemaining); 
     StartingDate = DateTime.Now; 
     UpdateDaysRemaining(); 
     MessageBox.Show("" + daysRemaining); 

    } 
+0

什麼叫Lifetime改變? – 2014-09-26 17:41:04

+1

你需要綁定到一個屬性。 – 2014-09-26 19:16:34

回答

0

你STARTINGDATE屬性觸發一個變更通知,這樣任何直接綁定到它會更新,但DaysRemaining屬性不會觸發一個變更通知。 DaysRemaining需要發出更改通知,讓綁定到它的對象知道他們需要更新。

DaysRemaining有點奇怪的屬性,因爲它是從三個其他值計算而不是明確設置。

將daysRemaining綁定到StartingDate和Lifetime非常簡單:它們在同一個類中緊密相關,並且StartingDate和Lifetime僅基於它們的setter進行更改。您可以讓StartingDate和Lifetime在兩者都發生更改時觸發DaysRemaining的更改通知,StartingDate和Lifetime可以設置DaysRemaining,以便DaysRemaining可以觸發自己的通知,或DaysRemaining可以偵聽StartingDate和Lifetime的更改通知(最後一個可能矯枉過正)。

棘手的部分是DaysRemaining將隨着DateTime.Now的變化。 DateTime.Now對於類是外部的,並且會比你關心的更頻繁地改變。您只關心何時(DateTime.Now - StartingDate).Days更改,並且這是可預測的。而不是綁定到DateTime.Now我會計算何時會更改並設置一個計時器以更新DaysRemaining更改。

+0

非常感謝您的建議......我在代碼中進行了一些更改,以便按鈕觸發更新'DaysRemaining'屬性的方法...仍然存在同樣的問題..您可以查看我上面的編輯。 – 2014-10-02 16:15:40

+0

您仍然需要調用NotifyPropertyChanged(「DaysRemaining」); When Days Remaining changes – 2014-10-03 22:13:28

+0

Opps you are so right ...非常感謝您在變更之後致電我,謝謝您:) – 2014-10-05 10:22:51