我有一个名为'SelectedDay'的对象,我将它实例化为:
Day SelectedDay = new Day(DateTime.Parse("01/01/0001"));
在Window_Loaded中,我将listBox Datacontext设置为:
lb_summary.DataContext = SelectedDay;
稍后在我的应用中,当用户点击另一个ListBox中的某一天时,我将其传递给新的SelectedDay:
public void RefreshSummary(Day _selectedDay)
{
SelectedDay = _selectedDay;
}
我希望lb_summary.DataContext变为_selectedDay但没有任何反应,SelectedDay与_selectedDay相同,但lb_summary.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
}
答案 0 :(得分:3)
现在忘记所有关于MVVM和DependencyProperties等的讨论...我们需要在这里获得一些基础知识。
你的作业不起作用的原因很简单:你的datacontext 没有改变,它是SelectedDay改变了。您的Day类是引用类型,因此现在分配的DataContext指向您的第一个SelectedDay对象。
但是稍后您决定将SelectedDay的分配更改为另一个Day对象。这有效,但它不会更改DataContext对象的引用。
答案 1 :(得分:1)
正如UrbanEsc所说,您的datacontext不会改变。因此设置属性SelectedDay不会改变任何东西或触发任何财产变更 要使它与您提供的代码一起使用,您应该写下:
public void RefreshSummary(Day _selectedDay)
{
lb_summary.DataContext = _selectedDay;
}
但正如其他人所指出的那样,最好将DataContext设置为一个对象,并将列表框绑定到该对象的属性。
答案 2 :(得分:0)
您通常不会绑定到某个值。您可以更改属性并实施INotifyPropertyChanged
。
答案 3 :(得分:0)
您可能要使用Binding
吗?使用UpdateSourceTrigger=PropertyChanged
并通过INotifyPropertyChanged
界面更改通知属性?
答案 4 :(得分:0)
查看MVVM design pattern。在这里,您将创建一个视图模型类型,其中包含SelectedDay
属性并在视图模型上实现INotifyPropertyChanged
。在SelectedDay
属性的setter中,您将调用PropertyChanged
事件。然后,您可以将视图的DataContext设置为视图模型的实例。
答案 5 :(得分:0)
如果SelectedDay不是您的ViewModel的一部分,并且可能是您的控件本身的属性(例如,datepicker可能具有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); }
}