2014-10-31 3 views
0

У меня небольшая проблема. Я делаю приложение календаря с некоторыми элементами списка. Каждый вид календаря извлекает «события календаря» из словаря, где TKey = DateTime и TValue = ObservableCollection <CalendarEvent>. Теперь это работает отлично для любого календарного дня, где уже есть предопределенные события. Я могу привязывать данные в список к свойству, содержащему ссылку на запись словаря этого конкретного календарного дня. Однако другой особенностью моего приложения должна быть возможность добавлять события во время выполнения. То, что я сделал прямо сейчас, заключается в том, что если в этот конкретный календарный день нет словарного ключа, он просто устанавливает свойство Events равным null, а затем меняю его во время выполнения, если событие было добавлено в этот день, к сожалению, это не похоже чтобы это так, оно не «связывается» должным образом или так сказать.Соблюдение данных привязки данных во время выполнения

Вот код

public CalendarDayView(DateTime date) 
    { 
     DataContext = this; 
     Date = date; 
     Events = CalendarRepository.Instance.Entries.ContainsKey(date) ? CalendarRepository.Instance.Entries[date] : null; 
    } 

    public DateTime Date { get; set; } 
    public ObservableCollection<CalendarEvent> Events { get; set; } 
    /// <summary> 
    /// This method will set the listbox item source to the ObservableCollection if it hasn't been set already 
    /// </summary> 
    public void UpdateItemSource() 
    { 
     if (Events == null) 
      // This is the part that doesn't do anything unfortunately 
      Events = CalendarRepository.Instance.Entries[Date]; 
    } 

XAML разметка

<ControlTemplate TargetType="{x:Type local:CalendarDayView}"> 
        <Border BorderBrush="Gray" BorderThickness="0.2" Width="100" Height="100"> 
         <Grid Name="contentGrid"> 
          <ListBox 
           Name="entriesListBox" Background="LightYellow" FontSize="10" 
            ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
           ItemsSource="{Binding Events}"> 
          </ListBox> 
         <!-- Date display below --> 
          <TextBlock 
           Name="dateTextBlock" Text="{Binding Date, StringFormat={}{0:dd-MMM}, UpdateSourceTrigger=PropertyChanged}" 
           FontFamily="Segoe UI Light" FontSize="18" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="5"/> 
         </Grid> 
        </Border> 
       </ControlTemplate> 

ответ

1

Я не вижу, вы поднимая PropertyChanged события в любом месте, чтобы уведомить вид обязательных изменений. Вы должны реализовать INotifyPropertyChanged на модели CalendarDayView и поднять реализованное событие PropertyChanged в своих установщиках свойств, которые используются в качестве источника привязки (Events в этом случае).

Следующий код показывает простой пример, но может быть лучше добавить функциональность PropertyChanged в базовый класс модели.

public class CalendarDayView : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private ObservableCollection<CalendarEvent> _events; 

    public ObservableCollection<CalendarEvent> Events 
    { 
     get { return _events; } 
     set 
     { 
      _events = value; 
      RaisePropertyChanged("Events"); 
     } 
    } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

Спасибо, это именно то, что я искал! –

Смежные вопросы