C# DataContext未更新(新手问题)
我有一个名为“SelectedDay”的对象,我将其实例化如下:C# DataContext未更新(新手问题),c#,wpf,C#,Wpf,我有一个名为“SelectedDay”的对象,我将其实例化如下: Day SelectedDay = new Day(DateTime.Parse("01/01/0001")); 在已加载的窗口中,我将listBox Datacontext设置为: lb_summary.DataContext = SelectedDay; 稍后在我的应用程序中,当用户在另一个列表框中单击某一天时,我会将新的SelectedDay传递给它: public void RefreshSummary(Day _se
Day SelectedDay = new Day(DateTime.Parse("01/01/0001"));
在已加载的窗口中,我将listBox Datacontext设置为:
lb_summary.DataContext = SelectedDay;
稍后在我的应用程序中,当用户在另一个列表框中单击某一天时,我会将新的SelectedDay传递给它:
public void RefreshSummary(Day _selectedDay)
{
SelectedDay = _selectedDay;
}
我希望lb_summary.DataContext变为_selectedDay,但什么也没有发生,selectedDay与_selectedDay相同,但lb_summary.DataContext为空
我错过了什么
编辑:
这是对象结构(它们实现INotifyPropertyChanged,编辑以保留breif):
公共课日:INotifyPropertyChanged
{
公共字符串标题{get;set;}
public DateTime DayDate{get;set;}
公共可观测的收集Gigs{get;set;}///在一个日间单元中预订的Gigs
}
公共类Gig:INotifyPropertyChanged
{
//gig的性质
}
通常不绑定到值。更改属性并实现INotifyPropertyChanged
通常不绑定到值。您可以更改属性并实现INotifyPropertyChanged
是否要使用绑定
?使用UpdateSourceTrigger=PropertyChanged
并通过INotifyPropertyChanged
接口通知属性更改 您是否可以使用绑定
?使用UpdateSourceTrigger=PropertyChanged
并通过INotifyPropertyChanged
接口通知属性更改 看一看。在这里,您将创建一个视图模型类型,其中包含SelectedDay
属性,并在视图模型上实现INotifyPropertyChanged
。在SelectedDay
属性的setter中,您将调用PropertyChanged
事件。然后,将视图的DataContext设置为视图模型的实例。请查看。在这里,您将创建一个视图模型类型,其中包含SelectedDay
属性,并在视图模型上实现INotifyPropertyChanged
。在SelectedDay
属性的setter中,您将调用PropertyChanged
事件。然后,将视图的DATACON文本设置为视图模型的一个实例。< P>如果SelectedDay不是视图模型的一部分,可能是控件本身的属性(例如,数据戳可能有一个SayDayDay1属性),请考虑在控件上创建SaleDayTyAsdiCyNyType,因此,它将处理对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); }
}
如果SelectedDay不是视图模型的一部分,可能是控件本身的一个属性(例如,数据包可能有一个SealDayDy属性),请考虑在您的控件上选择SaleDayTyAsdiCyNyType,这样它将处理对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); }
}
现在,忘掉所有关于MVVM和DependencyProperties之类的话题吧。。。我们需要一些基本的战略 你的作业不起作用的原因很简单:你的datacontext没有改变,而是选择了改变的日期。您的Day类是一个引用类型,因此现在指定的DataContext指向您的第一个SelectedDay对象
但是,稍后您决定将SelectedDay的指定更改为另一个Day对象。这是可行的,但是它不会改变DataContext对象的引用。现在,忘记所有关于MVVM和DependencyProperties等的讨论吧。。。我们需要一些基本的战略 你的作业不起作用的原因很简单:你的datacontext没有改变,而是选择了改变的日期。您的Day类是一个引用类型,因此现在指定的DataContext指向您的第一个SelectedDay对象
但是,稍后您决定将SelectedDay的指定更改为另一个Day对象。这是可行的,但是它不会更改DataContext对象的引用。正如UrbanEsc所说,您的DataContext不会更改。因此,设置SelectedDay属性不会更改任何内容或引发任何属性更改。
要使其与您提供的代码一起工作,您应该编写以下代码:
public void RefreshSummary(Day _selectedDay)
{
lb_summary.DataContext = _selectedDay;
}
但正如其他人指出的,最好将DataContext设置为对象,并将listbox绑定到该对象的属性。正如UrbanEsc所说,DataContext不会更改。因此,设置SelectedDay属性不会更改任何内容或引发任何属性更改。
要使其与您提供的代码一起工作,您应该编写以下代码:
public void RefreshSummary(Day _selectedDay)
{
lb_summary.DataContext = _selectedDay;
}
但正如其他人所指出的,最好将DataContext设置为对象,并将listbox绑定到该对象的属性。Ahh好的,我是否需要按照Daniel的建议更改SelectedDay的属性?我已尝试将DataContext重新分配给_selectedDay,但我收到一个线程错误。您是否理解为什么您的第一个代码没有执行您希望它执行的操作?此外,还有各种方法可以实现您想要的,Wpf方法肯定会涉及某种类型的数据绑定,但由于您似乎是Wpf的新手,我建议您先查阅一些关于Wpf的初学者教程。此外,如果尝试从非UI线程更新UI,则会出现异常。在调度程序上调用它。再说一次,这可能是你必须仔细阅读的东西!祝你好运是的,我理解,参考类型,非常感谢UrbanEsc的指针。啊,好的,我需要按照Daniel的建议更改SelectedDay的属性吗?我已尝试将DataContext重新分配给_selectedDay,但我收到一个线程错误。您是否理解为什么您的第一个代码没有执行您希望它执行的操作?此外,还有各种方法可以实现您想要的,Wpf方法肯定会涉及某种类型的数据绑定,但由于您似乎是Wpf的新手,我建议您先查阅一些关于Wpf的初学者教程。此外,如果您尝试从以下线程更新UI,则为“是”