2014-09-26 50 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