私はMVVMの原則でWPFを使用しています。ビューは次のようになります。
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<DataTemplate x:Key="ValveOptionTemplate" >
<Grid Margin="{StaticResource MyApp.DefaultMarginTopBottomThin}"
VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<myApp:CheckBox Grid.Column="0" Grid.Row="0"
Margin="{StaticResource
MyApp.DefaultMarginTopBottomThin}"
IsChecked="{Binding IsSelected}"
VerticalAlignment="Center"
Checked="ToggleButton_OnChecked"/>
<myApp:TextBox Grid.Column="1" Grid.Row="0"
Width="300"
Margin="{StaticResource MyApp.DefaultMarginLeftThin}"
VerticalAlignment="Center"
Text="{Binding Description,
UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding IsEditable}"
x:Name="textBox"/>
</Grid>
</DataTemplate>
</ResourceDictionary>
</UserControl.Resources>
<Grid x:Name="OptionGrid">
<ItemsControl x:Name="Options" ItemsSource="{Binding Options}"
ItemTemplate="{StaticResource ValveOptionTemplate}"
FocusVisualStyle="{x:Null}"
Margin="{StaticResource MyApp.DefaultMarginTopBottomThin}"/>
</Grid>
私が言う奇妙なことは何もありません。myApp:TextBox にアクセスしてフォーカスを設定しようとしています。このために、コードビハインドでこの(未完成の)スニペットを使用します(MVVMの原則が何であるかを知っており、違反しているとは思いません)。
private void ToggleButton_OnChecked( object sender, RoutedEventArgs e )
{
var cp = Options.ItemContainerGenerator.ContainerFromIndex(0) as ContentPresenter;
var dt = cp.ContentTemplate; //<--this is null! Why?
var tb = (TextBox)(dt.FindName( "textBox", cp ));
}
イベント ハンドラーに私のコメントが表示されますか? コンテンツ テンプレートが null ですか? なんで?何が間違っているのですか?