Windows Phone:数据绑定不会更新接口中的值
本文关键字:接口 更新 Phone 数据绑定 Windows | 更新日期: 2023-09-27 18:24:44
我的MainPage中有一个Textblock项,它绑定了myClass对象的值。我还有一个按钮,可以更改这个对象的属性值。尽管在单击按钮并实现INotifyPropertyChanged
接口时更新了值,但表示的值不会更改。这是我的代码:
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
的textBlock更改了值,但DaysRemaining
值要求重新启动应用程序以进行更改:
private void leftButtonChange_Click(对象发送方,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);
}
StartingDate属性触发一个更改通知,以便直接绑定到它的任何内容都将更新,但DaysMaining属性不触发更改通知。DaysMaining需要触发一个更改通知,让绑定到它的对象知道他们需要更新。
DaysRemaining有点奇怪,因为它是根据其他三个值计算的,而不是显式设置的。
将DaysRemaining与StartingDate和Lifetime联系起来非常容易:它们在同一类中密切相关,StartingDate与Lifetime的更改仅基于它们的setter。您可以让StartingDate和Lifetime在DaysMaining都发生更改时为其触发更改通知,StartingDate或Lifetime可以设置Daysmaining,以便Daysmainning可以触发自己的通知,或者Daysmainting可以侦听StartingDate的和Lifetime的更改通知(最后一个可能太夸张了)。
更棘手的部分是DaysMaining将随着DateTime.Now.DateTime.Now的变化而变化,它是类的外部,并且变化的频率将比您关心的要高得多。你只关心(DateTime.Now-StartingDate)。天会变,这是可以预测的。而不是绑定到DateTime。现在我会计算Days何时更改,并设置一个计时器在更改时更新DaysRemaining。