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
}
现在忘记所有关于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); }
}