.NET 4.0 には、3.5 には存在しない問題があります (以前または以降のフレームワークはテストしていません)。
Num プロパティ (整数型) を 1 つだけ持つデモ ユーザー コントロールを作成しました。
Public Class UserControl1
Public Shared NumProperty As DependencyProperty = _
DependencyProperty.Register("Num", _
GetType(Integer), _
GetType(UserControl1), _
New PropertyMetadata(defaultValue:=0, _
PropertyChangedCallback:=New PropertyChangedCallback(AddressOf OnNumPropertyChanged), _
CoerceValueCallback:=New CoerceValueCallback(AddressOf OnNumPorpertyCoerce)), _
New ValidateValueCallback(AddressOf IsNumValid))
Public Property Num As Integer
Get
Return GetValue(NumProperty)
End Get
Set(value As Integer)
SetValue(NumProperty, value)
End Set
End Property
Public Shared Function IsNumValid(value As Object) As Boolean
If value IsNot Nothing And TypeOf value Is Integer Then
If CInt(value) < 0 Then
Return False
End If
End If
Return True
End Function
Public Shared Sub OnNumPropertyChanged(sender As DependencyObject, e As DependencyPropertyChangedEventArgs)
' do nothing here
End Sub
End Class
ですので、基本的にNumにはゼロより小さい値は設定できません。
質問
このコントロールを WPF ウィンドウで使用して Num=-1 に設定しようとすると、例外が発生します。ただし、このコントロールを DataTemplate の一部として使用し、Num=-1 を設定しても、例外は発生しません。
ユーザー コントロールの Validation プロシージャにブレークポイントを配置しようとしましたが、ウィンドウ内のユーザー コントロールの場合にのみヒットし、DataTemplate 内にユーザー コントロールがある場合はヒットしません。
DataTemplate から検証が実行されない理由を説明できる人はいますか?
PS Microsoftのフォーラムで関連するスレッドを見つけることができます。