Ничего себе, это удивительно. Когда вы устанавливаете значение в свойстве зависимостей, выражения привязки обновляются до запуска значения.
Если вы посмотрите на DependencyObject.SetValueCommon в Reflector, вы можете увидеть вызов Expression.SetValue на полпути через этот метод. Вызов UpdateEffectiveValue, который будет вызывать ваш CoerceValueCallback, находится в самом конце, после того, как привязка уже обновлена.
Вы также можете увидеть это в классах инфраструктуры. Из нового приложения WPF добавьте следующий XAML:
<StackPanel>
<Slider Name="Slider" Minimum="10" Maximum="20" Value="{Binding Value,
RelativeSource={RelativeSource AncestorType=Window}}"/>
<Button Click="SetInvalid_Click">Set Invalid</Button>
</StackPanel>
и следующий код:
private void SetInvalid_Click(object sender, RoutedEventArgs e)
{
var before = this.Value;
var sliderBefore = Slider.Value;
Slider.Value = -1;
var after = this.Value;
var sliderAfter = Slider.Value;
MessageBox.Show(string.Format("Value changed from {0} to {1}; " +
"Slider changed from {2} to {3}",
before, after, sliderBefore, sliderAfter));
}
public int Value { get; set; }
Если вы перетащите ползунок, а затем нажмите кнопку, вы получите сообщение типа «Значение изменилось с 11 на -1, слайдер изменился с 11 на 10».
Взято из документов
отметка времени является синонимом для типа данных rowversion и зависит от поведения синонимов типа данных. В выражениях DDL везде, где это возможно, используйте метку строки вместо метки времени. Для получения дополнительной информации см. Синонимы типов данных (Transact-SQL).
blockquote>и
Синтаксис метки времени устарел.
blockquote>и
Тип данных, который предоставляет автоматически генерируемые уникальные двоичные числа в базе данных. rowversion, как правило, используется в качестве механизма для строк таблицы штампов версий. Размер хранилища составляет 8 байт.
blockquote>Итак, соберите все вместе: представьте
TIMESTAMP
(который должен бытьROWVERSION
) как бессмысленный 8-байтовый двоичный файл. Если вы действительно хотите что-то с этим сделать, вы можете сохранить его как 8-байтовый двоичный файл или преобразовать его в тип длиной 8 байт. В этом случае я бы предложилBIGINT
.
Во-первых, следует понимать, что отметка времени НЕ является значением типа date and time, а скорее уникальным идентификатором, основанным на данных этого типа.
Я предлагаю вам ознакомиться с документацией Типы и функции данных даты и времени (Transact-SQL) и выбрать тип данных, который наилучшим образом соответствует вашим потребностям. Это может быть DATETIME2, DATETIMEOFFSET, DATETIME