2012-06-24 101 views
2

我有一個奇怪的問題,在後面的代碼中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控件,因此不能像這樣綁定它。

回答

7

什麼你錯過的是,在一個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

這不起作用,但你已經把我放在正確的軌道上 - 謝謝 –

3

它們是隱藏的,因爲它們在模板控件中。

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; 

    }