在代码隐藏中无法识别XAML控件

问题描述:

我有一个奇怪的问题,在后面的代码中XAML控件不可见。这里是XAML的一个样本:在代码隐藏中无法识别XAML控件

<ListView Name="lvtest" Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0" 
       ItemsSource="{Binding Content}" > 
    <ListView.ItemTemplate> 
     <DataTemplate>  
      <StackPanel>         
       <WebView Name="contentView" Style="{StaticResource BodyTextStyle}" /> 
       <TextBlock Name="testtxt" Text="{Binding}" Style="{StaticResource BodyTextStyle}" Foreground="GreenYellow"/> 

在后面的代码:

this.lvtest是公认的,但:

this.contentViewthis.testtxt都没有。我也试过x:Name

我很明显在这里错过了一些明显的东西,我只是看不到什么。

编辑:

为了澄清,TextBox控件是要被用来显示基于绑定一些格式化的文本,但我发现的是,文本HTML格式(this建议使用WebView控件)。据我所见,我需要NavigateToString来使用WebView控件,因此不能像这样绑定它。

什么你错过的是,在一个DataTemplate定义的元素可以在页面的任何数量的上次,甚至可以在运行时改变。哪一个应该链接到contentView字段?没有好的方法来回答这个问题,所以它不会创建一个contentView字段。换句话说,你并没有定义页面包含这些元素,而是声明了一个可以从中创建元素的模板。

如果你让我们知道你是如何使用它,我们可能会建议另一种方式。

编辑:在代码

<WebView Loaded="contentView_Loaded" Style="{StaticResource BodyTextStyle}" /> 

然后:这样的事情可能会为你工作

void contentView_Loaded(object sender, EventArgs e) 
{ 
    var contentView = (WebView)sender; 
    var dataContext = (YourDataType)contentView.DataContext; 
    // do something 
} 
+0

我编辑的问题。基本上我试图在绑定列表中显示格式化的HTML(这就是TextBlock最初的用途)。 –

+1

这不起作用,但你已经把我放在正确的轨道上 - 谢谢 –

它们是隐藏的,因为它们在模板控件中。

http://social.msdn.microsoft.com/Forums/en/wpf/thread/29ecc8ee-26ee-4331-8f97-35ff9d3e6886

<ListView Name="listview"> 

    <ListView.ItemTemplate> 

     <DataTemplate> 

      <StackPanel Orientation="Horizontal" > 

      <TextBlock Name="textYear" Text="{Binding Year}" /> 

       <TextBlock Text=" " /> 

      <TextBlock Name="textDayOffWeek" Text="{Binding DayOfWeek}" /> 

       </StackPanel> 

     </DataTemplate> 

    </ListView.ItemTemplate> 

    <s:DateTime >1/2/2007</s:DateTime> 

    <s:DateTime >1/3/2008</s:DateTime> 

    <s:DateTime >1/5/2007</s:DateTime> 

    <s:DateTime >1/6/2006</s:DateTime> 

</ListView> 

    <Button Width="180" Height="30" Content="Find TextBlock in DataTemplate" Click="FindElement" /> 

    </StackPanel> 

在后面的代码:

private void FindElement(object sender, RoutedEventArgs e) 

    { 

     // get the current selected item 

     ListViewItem item = listview.ItemContainerGenerator.ContainerFromIndex(listview.SelectedIndex) as ListViewItem; 

     TextBlock textYear = null; 

     if (item != null) 

     { 

      //get the item's template parent 

      ContentPresenter templateParent = GetFrameworkElementByName<ContentPresenter>(item); 

      //get the DataTemplate that TextBlock in. 

      DataTemplate dataTemplate = listview.ItemTemplate; 

      if (dataTemplate != null && templateParent != null) 

      { 

       textYear = dataTemplate.FindName("textYear", templateParent) as TextBlock; 

      } 

      if (textYear != null) 

      { 

       MessageBox.Show(String.Format("Current item's Year is:{0}", textYear.Text)); 

      } 

     } 



    } 

    private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement 

    { 

     FrameworkElement child = null; 

     for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++) 

     { 

      child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement; 

      System.Diagnostics.Debug.WriteLine(child); 

      if (child != null && child.GetType() == typeof(T)) 

      { break; } 

      else if (child != null) 

      { 

       child = GetFrameworkElementByName<T>(child); 

       if (child != null && child.GetType() == typeof(T)) 

       { 

        break; 

       } 

      } 

     } 

     return child as T; 

    }