Да.У меня есть идея.
Причина, по которой ваш код не работает, заключается в том, что кнопка запрашивает новое значение, но объект Binding содержит старое значение, поскольку у него нет уведомления PropertyChanged.Цепочка изменений в стандартном сценарии выглядит следующим образом:
Payload.Timestamp -> объект привязки -> Button.ContentProperty
В вашем сценарии при вызове InvalidateProperty
chainis:
Объект привязки -> Button.ContentProperty
Итак, вы должны уведомить объект привязки об изменении его источника следующим кодом:
private void Invalidate(object sender, RoutedEventArgs e)
{
_payload.Timestamp = DateTime.Now.Add(TimeSpan.FromHours(1)).ToLongTimeString();
Button b = sender as Button;
BindingExpression be = b.GetBindingExpression(Button.ContentProperty);
be.UpdateTarget();
}
Как видите, я даже не должен вызывать InvalidateProperty
, потому что механизм связывания из-за изменения базового источника автоматически заставит Button обновить содержимое.