如何以编程方式刷新wpf c#?

如何以编程方式刷新wpf c#?,c#,wpf,binding,observablecollection,C#,Wpf,Binding,Observablecollection,我有这个场景,让模型来解释 public class ScheduleMonthlyPerDayModel { public DateTime Date { get; set; } public string Day { get { return Date.Day.ToString(); } } ObservableCollection<AppointmentDTO&g

我有这个场景,让模型来解释

public class ScheduleMonthlyPerDayModel 
{
    public DateTime Date { get; set; }

    public string Day 
    { 
        get
        {
            return Date.Day.ToString();
        }
    }

    ObservableCollection<AppointmentDTO> _appointments;
    public ObservableCollection<AppointmentDTO> Appointments 
    {
        get
        {
            return _appointments;
        }
        set
        {
            _appointments = value;

            if (value.Count > 0)
                NotifyOfPropertyChange(() => HasSchedule);
        }
    }

    public bool BelongsToCurrentMonth
    {
        get;
        set;
    }

    public bool HasSchedule
    {
        get
        {
            return _appointments.Count > 0 ? true : false;
        }
    }

    public ScheduleMonthlyPerDayModel()
    {
        _appointments = new ObservableCollection<AppointmentDTO>();
    }

    public void ClearCollection()
    {
        _appointments.Clear();
    }
}

public class ScheduleMonthlyPerWeekModel
{
    public ScheduleMonthlyPerDayModel Sunday{get; set;}

    public ScheduleMonthlyPerDayModel Monday{get; set;}

    public ScheduleMonthlyPerDayModel Tuesday{get; set;}

    public ScheduleMonthlyPerDayModel Wednesday{get; set;}

    public ScheduleMonthlyPerDayModel Thursday{get; set;}

    public ScheduleMonthlyPerDayModel Friday{get; set;}

    public ScheduleMonthlyPerDayModel Saturday{get; set;}
}
基本上,我试图实现每月查看,每天都有一组约会。我的问题是,当我以编程方式将项添加到(例如,此处为saturday.Appoints)集合时,通过调试成功追加项并通知主集合(weekcollection),不会刷新UI

我想实现的是:在我将假定的约会添加到相应的日期后,用户界面也会相应地更新,但我该如何做到这一点


目前,只有当我更改/切换到“不同”,然后返回时,UI才会更新,之后约会会很好地显示出来。我想将其自动化,因为要求用户在查看约会列表之前切换到其他内容然后返回是很难看的。

正如Nick所建议的,使用INotifyPropertyChanged界面是关键

如果希望ObsCollection了解属性更改,则必须实现上面链接中显示的此界面。这将在添加、删除或更改某些内容时更新它绑定到的UI控件。如果没有它,您实际上必须跟踪代码中的更改并手动更新它们

它实际上很容易实现和使用,而且非常棒。如果您不想使用此功能,您可以使用winform


希望这有帮助。

正如Nick所建议的,使用INotifyPropertyChanged接口是关键

如果希望ObsCollection了解属性更改,则必须实现上面链接中显示的此界面。这将在添加、删除或更改某些内容时更新它绑定到的UI控件。如果没有它,您实际上必须跟踪代码中的更改并手动更新它们

它实际上很容易实现和使用,而且非常棒。如果您不想使用此功能,您可以使用winform


希望这能有所帮助。

可见性的问题在于它绑定到一个只读属性,该属性在get上计算值。因此,它无法通知它已更改

HassSchedule属性需要知道约会属性何时更改。约会属性的setter只知道整个列表何时更改。在您的情况下,您需要知道列表的内容何时更改

ObservableCollection有一个事件,告诉您列表内容何时更改,称为CollectionChanged。您应该执行以下操作,以通知您的HassSchedule属性已使用此事件更改:

ObservableCollection<AppointmentDTO> _appointments;
public ObservableCollection<AppointmentDTO> Appointments
{
    get
    {
        return _appointments;
    }
    set
    {
        if (_appointments != value)
        {
            if (_appointments != null)
                _appointments.CollectionChanged -= Appointments_CollectionChanged;

            _appointments = value;

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("HasSchedule"));

            if (_appointments != null)
                _appointments.CollectionChanged += Appointments_CollectionChanged;
        }
    }
}

void Appointments_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs("HasSchedule"));
}
observedcollection\u预约;
公开募捐任命
{
得到
{
返回预约;
}
设置
{
如果(_约会!=值)
{
如果(_约会!=null)
_appointments.CollectionChanged-=appointments\u CollectionChanged;
_任命=价值;
if(PropertyChanged!=null)
房地产变更(这是指新的房地产变更数据表(“HasSchedule”);
如果(_约会!=null)
_appointments.CollectionChanged+=约会\u CollectionChanged;
}
}
}
无效约会\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
if(PropertyChanged!=null)
房地产变更(这是指新的房地产变更数据表(“HasSchedule”);
}

正如您所说,这是假设您已经在ViewModel中实现了INotifyPropertyChanged。在这种情况下,每次集合以某种方式更改时,它都会通知HassSchedule属性已更改。绑定将刷新该值,并在其发生更改时更新可见性。

可见性的问题在于它绑定到一个只读属性,该属性在get上计算值。因此,它无法通知它已更改

HassSchedule属性需要知道约会属性何时更改。约会属性的setter只知道整个列表何时更改。在您的情况下,您需要知道列表的内容何时更改

ObservableCollection有一个事件,告诉您列表内容何时更改,称为CollectionChanged。您应该执行以下操作,以通知您的HassSchedule属性已使用此事件更改:

ObservableCollection<AppointmentDTO> _appointments;
public ObservableCollection<AppointmentDTO> Appointments
{
    get
    {
        return _appointments;
    }
    set
    {
        if (_appointments != value)
        {
            if (_appointments != null)
                _appointments.CollectionChanged -= Appointments_CollectionChanged;

            _appointments = value;

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("HasSchedule"));

            if (_appointments != null)
                _appointments.CollectionChanged += Appointments_CollectionChanged;
        }
    }
}

void Appointments_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs("HasSchedule"));
}
observedcollection\u预约;
公开募捐任命
{
得到
{
返回预约;
}
设置
{
如果(_约会!=值)
{
如果(_约会!=null)
_appointments.CollectionChanged-=appointments\u CollectionChanged;
_任命=价值;
if(PropertyChanged!=null)
房地产变更(这是指新的房地产变更数据表(“HasSchedule”);
如果(_约会!=null)
_appointments.CollectionChanged+=约会\u CollectionChanged;
}
}
}
无效约会\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
if(PropertyChanged!=null)
房地产变更(这是指新的房地产变更数据表(“HasSchedule”);
}

正如您所说,这是假设您已经在ViewModel中实现了INotifyPropertyChanged。在这种情况下,每次集合以某种方式更改时,它都会通知HassSchedule属性已更改。绑定将刷新值并在其发生更改时更新可见性。

什么是
NotifyOfPropertyChange
,我看不到INotifyPropertyChanged的实现。如果绑定控件的数据源,则不必“刷新”任何内容。现在,如果向约会集合添加项目,它应该自动显示该项