2015-06-22 3 views
2

XAML код: (! Статический экземпляр ViewModel - только для теста)WP8.1 DatePicker связывания - значение никогда не обновляется

<DatePicker Date="{Binding DateTimeOffsetTest}"></DatePicker> 

DataContext устанавливается в App.ViewModel

ViewModel:

public class ViewModel : INotifyPropertyChanged 
    { 
     private DateTimeOffset _dateTimeOffsetTest = new DateTimeOffset(new DateTime(1980, 10, 10)); 

     public DateTimeOffset DateTimeOffsetTest 
     { 
      get { return _dateTimeOffsetTest; } 
      set 
      { 
       _dateTimeOffsetTest = value; 
       //Was OnPropertyChanged(""); (Thanks to Will for fix) 
       OnPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     [NotifyPropertyChangedInvocator] 
     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      var handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Для теста я просто инициализировал ViewModel как статический экземпляр в приложении. Я добавил этот код в обработчик события Нажмите на кнопку в:

App.ViewModel.DateTimeOffsetTest = new DateTimeOffset(new DateTime(1988, 09, 11));; 

Проблема заключается в том, что DatePicker ведет себя, как это связывание одноразовая. Если я обновляю свойство в ViewModel, DatePicker не будет обновляться. Я попытался установить режим OneWay и изменить UpdateSourceTrigger, но он не работает.

У кого-нибудь есть решение?

+0

Если все правильно, оно должно работать. Все не так. Вам нужно добавить код для свойства и пример того, как вы его обновляете из кода. Без сомнения, у вас есть ошибка. – Will

+0

Отредактированный пост со всей необходимой информацией. Спасибо за вашу помощь. @Will – Millkovac

+0

И с этой информацией у нас есть ответ! Простое исправление, и вы будете в пути. – Will

ответ

0

(обратите внимание, что этот ответ относится к исходному коду вопроса)

OnPropertyChanged("");

Да, Нету. Вы предоставляете имя (бессмысленное - пустую строку) для свойства, которого не существует.

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

В этом случае propertyName будет поставляться только если вы опускаете аргумент в вызове метода.

По the reference docs at MSDN:

Атрибуты Caller Info не делают необязательный параметр. Вместо этого они влияют на значение по умолчанию, которое передается в , когда аргумент опущен.

Если передать любого значения в метод, он перекроет CallerMemberNameAttribute -assigned значения.

В своих сеттерах свойств, выполните следующие действия:

public DateTimeOffset DateTimeOffsetTest 
{ 
    get { return _dateTimeOffsetTest; } 
    set 
    { 
     _dateTimeOffsetTest = value; 
     OnPropertyChanged(); // LOOK HERE 
    } 
} 

Структура обеспечит имя вызывающего абонента к методу, так как вы не предоставили. Теперь ваши привязки будут работать.

+0

Ошибка с моей стороны (обычно я использую структуру MvvmLight), однако она по-прежнему не работает. Я попробовал также указать имя свойства - OnPropertyChanged («DateTimeOffsetTest»); – Millkovac

+0

@Millkovac Если этот вызов был в вашем коде, что было ошибкой, и это исправление. Если вы не привинчиваете что-то еще, это гарантированно сработает. Создайте прототип и посмотрите. Вероятно, у вашего DatePicker нет ожидаемого DataContext. Ваши правки на мой ответ: /. – Will

+0

Работает в WPF. Я знаю, что все настроено правильно, поскольку значение DatePicker правильно задано при первоначальной привязке, однако любые изменения не отражаются. – Millkovac

0

По-видимому, режим привязки OneWay DatePicker прослушивается и изменения не отражаются. Вы можете «решить» проблему, установив режим привязки на TwoWay.

<DatePicker Date="{Binding DateTimeOffsetTest, Mode=TwoWay}"> 
Смежные вопросы