0

我有这个场景很好,我会让模型解释。

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

与 xaml 的绑定正在使用 xaml 的一瞥,如下所示:

headereditemscontrol itemsSource= weekcollection,其中 weekcollection 是 的对象schedulemonthlyperweekmodel

在该 headereditemscontrol 中,我每天都为 schedulemonthlyperweekmodel 的每个属性进行模板化,如下所示:

<Grid.ColumnDefinitions>
    <ColumnDefinition />
    <ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"  Style="{StaticResource CalendarDates}" Text="{Binding Path=Saturday.Day}" />
<ListBox Grid.Row="1" Grid.ColumnSpan="2" Padding="0" 
         ItemsSource="{Binding Path= Saturday.Appointments}"
         ItemTemplate="{StaticResource myItemStyle}"
         Visibility="{Binding Path=Saturday.HasSchedule, Converter={StaticResource BoolToVisibilityConverter}}" />

基本上,我试图通过每天都有一系列约会来实现每月视图。我的问题是,当我以编程方式将项目添加到例如此处的 saturday.appointments 集合时,通过调试附加项目成功并通知主集合(weekcollection),不会刷新 UI。

我想要实现的是:在我将假定的约会添加到其相应的日期/日期后,用户界面也会相应地更新,但我该怎么做呢?

目前,UI 仅在我更改/切换到不同然后返回时才会更新,之后会很好地显示约会。我想自动化它,因为要求用户在看到约会列表之前切换到其他东西然后返回是很难看的。

4

2 回答 2

3

正如尼克建议的那样,使用 INotifyPropertyChanged 接口是关键。

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

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

它实际上很容易实现和使用,而且非常棒。如果您不想使用它,您可能只是使用了一个winform。=)

希望这可以帮助。

于 2012-06-13T18:16:51.323 回答
1

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

您的 HasSchedule 属性需要知道 Appointment 属性何时更改。Appointment 属性的设置器只知道整个列表何时更改。在您的情况下,您需要知道列表的内容何时更改。

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

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

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

于 2012-06-14T00:09:53.483 回答