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);
    }

Windows Phone:数据绑定不会更新接口中的值

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。