DataContext未更新(新手问题)

本文关键字:问题 新手 更新 DataContext | 更新日期: 2023-09-27 18:01:37

我有一个名为"SelectedDay"的对象,我这样实例化它:

Day SelectedDay = new Day(DateTime.Parse("01/01/0001"));

在Window_Loaded中,我为其设置了listBox数据内容:

lb_summary.DataContext = SelectedDay;

稍后,在我的应用程序中,当用户在另一个ListBox中单击某一天时,我会将其传递给新的SelectedDay:

public void RefreshSummary(Day _selectedDay)
{
    SelectedDay = _selectedDay;
}

我希望lb_summary.DataContext变为_selectedDay,但什么也没发生,selectedDay与_selectedDay相同,但lb_sumary.DataContext为空。

我错过了什么?

编辑

这是对象结构(它们确实实现了INotifyPropertyChanged,经过编辑以保持breif(:

public class Day : INotifyPropertyChanged
{       
    public string Title { get; set; }
    public DateTime DayDate { get; set; }
    public ObservableCollection<Gig> Gigs { get; set; }// gigs booked in a day_cell
}
public class Gig : INotifyPropertyChanged
{
    // Properties of a gig
}

DataContext未更新(新手问题)

现在忘记所有关于MVVM和DependencyProperty等的讨论。。。我们需要得到一些基本的straigt在这里。

你的作业不起作用的原因很简单:你的数据上下文没有改变,改变的是SelectedDay。您的Day类是一个引用类型,因此当分配DataContext时,它现在指向您的第一个SelectedDay对象。

但是,稍后您决定将SelectedDay的分配更改为另一个Day对象。这是有效的,但是它不会更改DataContext对象的引用。

正如UrbanEsc所说,您的数据上下文不会改变。因此,设置属性SelectedDay不会更改任何属性或触发任何属性更改
为了使它与您提供的代码一起工作,您应该这样写:

public void RefreshSummary(Day _selectedDay)
{
    lb_summary.DataContext = _selectedDay;
}

但正如其他人指出的那样,最好将DataContext设置为一个对象,并将listbox绑定到该对象的属性。

您通常不绑定到值。您可以更改属性并实现INotifyPropertyChanged

您可能要使用Binding吗?使用UpdateSourceTrigger=PropertyChanged并通过INotifyPropertyChanged接口通知属性更改?

看看MVVM的设计模式。在这里,您将创建一个包含SelectedDay属性的视图模型类型,并在视图模型上实现INotifyPropertyChanged。在SelectedDay属性的setter中,您将调用PropertyChanged事件。然后将视图的DataContext设置为视图模型的实例。

如果SelectedDay不是ViewModel的一部分,并且可能是控件本身的一个属性(例如,日期选择器可能具有SelectedDay属性(,请考虑将SelectedDay设置为控件上的DependencyProperty,这样它将处理到UI:的通知

public static readonly DependencyProperty SelectedDayProperty =
        DependencyProperty.Register("SelectedDay", typeof(Day), typeof(type_of_yourcontrol for instance DatePicker?));
public Day SelectedDay
{
     get { return (Day)GetValue(SelectedDayProperty); }
     set { SetValue(SelectedDayProperty, value); }
}