できればスタイルを使用して、テキストボックス内のテキストの選択を無効にしたい。その理由は、特定の基準(IsRenaming)が満たされるまで、テキストボックスをテキストブロックのように見せかけるスタイルがあるためです。これらはツリービューのノードであるため、ユーザーがテキストを選択できないようにします。スタイルは次のとおりです。
<Style x:Key="TextBlockStyleForTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="IsReadOnly" Value="True" />
</Style>
<Style x:Key="RenamingTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBlockStyleForTextBox}">
<Setter Property="Cursor" Value="Arrow"/>
<Setter Property="Padding" Value="0" />
<Setter Property="Margin" Value="0" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsRenaming}" Value="true">
<DataTrigger.Setters>
<Setter Property="TextBox.IsReadOnly" Value="False" />
<Setter Property="Cursor" Value="IBeam" />
<Setter Property="Background" >
<Setter.Value>
<SolidColorBrush Color="{DynamicResource WhiteColor}"/>
</Setter.Value>
</Setter>
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="2" />
<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}"/>
<Setter Property="behaviors:TextBoxBehavior.SelectAll" Value="True"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
IsReadOnlyをどこでもオーバーライドしているとは思いません。これが私のテキストボックスの定義です:
<DataTemplate x:Key="MyTemplate" >
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=TreeView}}"
Style="{StaticResource RenamingTextBox}">
...など