我正在使用WPF和MVVM原则。 视图如下所示:
<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 ));
}
你在事件处理程序中看到我的评论? contenttemplate是null?为什么?出了什么问题?
答案 0 :(得分:1)
在评估绑定时,尚未构建完整的可视化树。
这就是模板不可用的原因。
为了解决此问题,您必须使用cp.ApplyTemplate
调用Dispatcher.BeginInvoke()
或推迟在UI线程处于后台时执行的代码。