【问题标题】:Binding on Elements of an ObservableCollection only change when Page is reloadedObservableCollection 元素的绑定仅在页面重新加载时更改
【发布时间】:2014-01-06 18:15:51
【问题描述】:

我正在使用 C#/XAML 以及 MVVM-Light Toolkit 编写 Windows 8.1 应用程序。

在我的程序中有一个由 3 个组件组成的时间表:

  • 一个包含 5 个元素的 GridView,用于星期一、星期二……
  • 带有 x 个元素的 ListView,每个元素显示 当前期间。 x 取决于用户选择的周期数 让他的日程安排。
  • 带有 5*x 个元素的 GridView,表示事件的位置 由用户设置。

这 3 个组件再次位于 FlipView 中以启用多个计划。 我通过以下对象在代码中启用了此功能:

public class Schedule
{
    public int WeekNumber { get; set; }

    public ScheduleComponentSettings ScheduleComponentSettings { get; set; }    
    public ScheduleComponents ScheduleComponents { get; set; }
} 


public class ScheduleComponents
{
    public ObservableCollection<WeekDay> WeekDayItems { get; set; }
    public ObservableCollection<FreePeriod> FreePeriodItems { get; set; }
    public ObservableCollection<PeriodTime> PeriodTimesItems { get; set; }
    public ObservableCollection<LessonTime> LessonTimesItems { get; set; }
}

在我的 ViewModel 中,我有一个 Schedule 类的 ObservableCollection:

public ObservableCollection<Schedule> ScheduleComponentsList
{
    get
    {
        return _ScheduleComponentsList;
    }

    set
    {
        if (_ScheduleComponentsList == value)
        {
            return;
        }

        RaisePropertyChanging(ScheduleWeekListPropertyName);
        _ScheduleComponentsList = value;
        RaisePropertyChanged(ScheduleWeekListPropertyName);
    }
}

FlipView 及其元素按如下方式绑定到它(这是 ofc。缩短为仅显示 ItemsSources):

<FlipView
    ItemsSource="{Binding Main.ScheduleComponentsList, Source={StaticResource Locator}}" 
    <FlipView.ItemTemplate>
          <DataTemplate>
             <GridView                  
                 ItemsSource="{Binding ScheduleComponents.WeekDayItems}"/>
             <ListView                  
                 ItemsSource="{Binding ScheduleComponents.PeriodTimesItems}"/>
             <GridView                  
                 ItemsSource="{Binding ScheduleComponents.FreePeriodItems}"/>
        </DataTemplate>
    </FlipView.ItemTemplate>
</FlipView>

现在问题来了: 当我更改 FreePeriodItems 内的元素的属性时,甚至当我完全替换集合时,视图只会在我重新加载整个页面时更新。对于我在 ScheduleComponents 上更新的所有其他属性也是如此。 但是,当我更改 ScheduleComponentList 本身时,不会发生这种情况。例如,当我向其中添加项目时,它们会在视图中自动更新。

现在我已经坐了很久了。

【问题讨论】:

标签: c# xaml data-binding mvvm windows-8.1


【解决方案1】:

但是,当我更改 ScheduleComponentList 本身时,不会发生这种情况。例如,当我向其中添加项目时,它们会在视图中自动更新。

这正是ObservableCollection&lt;T&gt; 的工作原理。仅当列表本身发生变化时,当您添加或删除元素时,它才会引发事件:

表示一个动态数据集合,在添加、删除项目或刷新整个列表时提供通知。

来自ObservableCollection Class

要使其工作,请在您的 WeekDayFreePeriodPeriodTimeLessonTime 上实施 INotifyPropertyChanged。完成后,您不仅会在集合更改时收到事件,而且还会在已属于集合的任何项目被修改时收到事件。

【讨论】:

  • 嘿,你的回答似乎是正确的,我明白你的意思。但是我对此仍然很陌生,不知道在哪里实现它。你能通过发布一个例子来告诉我吗?非常感谢!
  • 嘿,你是说这行:public class NameList : ObservableCollection?如果是,我会遇到 SQLite 的问题——我将它用于我的数据库——不知道该属性...
  • 你绑定的所有类都应该实现INotifyPropertyChanged接口。与ObservableCollection&lt;T&gt;无关,这是规矩。
猜你喜欢
  • 2015-03-27
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2016-04-22
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多