DataContext не обновляется (вопрос новичка) - PullRequest
0 голосов
/ 08 июля 2011

У меня есть объект с именем 'SelectedDay'. Я создаю его экземпляр следующим образом:

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

В Window_Loaded я установил для него список данных Datacontext:

lb_summary.DataContext = SelectedDay;

Позже в моем приложениикогда пользователь нажимает на день в другом ListBox, я передаю ему новый SelectedDay:

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

Я ожидаю, что lb_summary.DataContext станет _selectedDay, но ничего не происходит, SelectedDay совпадает с _selectedDay, но lb_summary.DataContextпусто.

Чего мне не хватает?

РЕДАКТИРОВАТЬ :

это структура объекта (они реализуют INotifyPropertyChanged, отредактированный для сохранения краткости):

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 ]

3 голосов
/ 08 июля 2011

А пока забудем все разговоры о MVVM и DependencyProperties и тому подобном ... нам нужно немного разобраться с основами.

Причина, по которой ваше назначение не работает, проста: ваш текстовый текст не меняется , меняется SelectedDay. Ваш класс Day является ссылочным типом, поэтому DataContext при назначении теперь указывает на ваш первый объект SelectedDay.

Однако позже вы решите изменить присвоение SelectedDay другому объекту Day. Это работает, однако это не меняет ссылку на объект DataContext.

1 голос
/ 08 июля 2011

Как сказал UrbanEsc, ваш текст данных не меняется.Следовательно, установка свойства SelectedDay не собирается ничего менять или запускать любые изменения свойств.
Чтобы заставить его работать с предоставленным вами кодом, вы должны написать следующее:

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

, но, как отмечали другие,лучше установить свой DataContext для объекта и связать список со свойством этого объекта.

0 голосов
/ 08 июля 2011

Если 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); }
}
0 голосов
/ 08 июля 2011

Взгляните на шаблон проектирования MVVM .Здесь вы должны создать тип модели представления, который содержит свойство SelectedDay, и реализовать INotifyPropertyChanged в вашей модели представления.В установщике для вашего свойства SelectedDay вы вызываете событие PropertyChanged.Затем вы должны установить для DataContext вашего представления экземпляр вашей модели представления.

0 голосов
/ 08 июля 2011

Может быть, вы будете использовать Binding? с UpdateSourceTrigger=PropertyChanged и уведомлять об изменении свойства через интерфейс INotifyPropertyChanged?

0 голосов
/ 08 июля 2011

Вы обычно не привязываетесь к значению.Вы меняете свойства и реализуете INotifyPropertyChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...