カスタム ユーザー コントロールを使用する前は、リスト ボックスで選択したアイテムのプロパティにバインドされたテキスト プロパティを持つ標準の textxbox を使用していました。バインディングでは、検証規則も使用されました。このプロパティが設定された後、テキスト変更イベントが xaml で発生し、すべてが正常に機能しました。
テキスト ボックスを含むユーザー コントロールを使用するように変更しました。テキスト ボックスのテキスト プロパティにバインドされている依存関係プロパティをユーザー コントロールに追加しました。検証が行われる前にテキストが変更されると、イベントが発生するようになりました。同じアイテムの別のプロパティにバインドされているダイアログのチェックボックスがチェックされるまで、検証は行われません。モデル ビューの set メソッドのブレークポイントは、リスト ボックスの最初の選択以外では壊れていませんが、テキスト ボックスをクリックした後に効果が見られるため、値が更新されています。検証によって表示されるエラーメッセージは、チェックボックスがクリックされるまで表示されません。
ウィンドウ内のユーザー コントロールの XAML:
<my:BoundTextBox x:Name="spacingValueBox" TextBoxBase.TextChanged="spacingValueBox_TextChanged">
<my:BoundTextBox.Text>
<Binding Path="SelectedItem.Property" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
<Binding.ValidationRules>
<validators:ValidationRule ErrorMessage="Invalid"/>
</Binding.ValidationRules>
</Binding>
</my:BoundTextBox.Text>
XAML でユーザー コントロールにバインドされた Text プロパティ:
<UserControl x:Class="ButtonTextBox" ...
... Name="control">
<TextBox Text="{Binding Text, ElementName=control}"/>
依存関係プロパティ:
public static readonly DependencyProperty TextProperty =
TextBox.TextProperty.AddOwner(typeof(BoundTextBox));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}