为什么Contenttemplate为null

时间:2013-11-30 15:09:01

标签: wpf mvvm itemcontainergenerator contenttemplate

我正在使用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?为什么?出了什么问题?

1 个答案:

答案 0 :(得分:1)

在评估绑定时,尚未构建完整的可视化树。

这就是模板不可用的原因。

为了解决此问题,您必须使用cp.ApplyTemplate调用Dispatcher.BeginInvoke()或推迟在UI线程处于后台时执行的代码。