DataContext没有更新(新手问题)

时间:2011-07-08 11:01:48

标签: c# wpf

我有一个名为'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
}

6 个答案:

答案 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); }
}