2009-08-14 46 views
0

我在嘗試查找DataTemplate中聲明的元素時遇到了問題,之後像ContentTemplate一樣應用於TabItem對象。 我看到這個問題已經有了一些解決方案,但是其中沒有一個適用於我的情況,我想知道爲什麼(很明顯我在某個地方犯了錯誤) 以下是一個示例代碼:查找應用於TabItem的DataTemplate中的元素

<DataTemplate x:Key="TabItemDataTemplate">    
    <Grid HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" Name="templateGrid"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="6.0*"> </RowDefinition> 
      <RowDefinition Height="6" ></RowDefinition> 
      <RowDefinition Height="6.0*" ></RowDefinition> 
      <RowDefinition Height="*" ></RowDefinition> 
     </Grid.RowDefinitions>     

     <ListView x:Name="repoView" Grid.Row="0" 
      VerticalAlignment="Stretch" 
      ItemsSource="{Binding Source={StaticResource DataProviderForListView}}">       
      <GridView> 
       <GridViewColumn Header="State" 
        DisplayMemberBinding="{Binding Path=RepositoryItemState}"/> 
       <GridViewColumn Header="Working Copy Rev num." 
        DisplayMemberBinding="{Binding Path=WCRevision}"/> 
       <GridViewColumn Header="Repository Rev num." 
        DisplayMemberBinding="{Binding Path=RepoRevision}"/> 
       <GridViewColumn Header="User" 
        DisplayMemberBinding="{Binding Path=Account}"/> 
       <GridViewColumn Header="Item" 
        DisplayMemberBinding="{Binding Path=ItemName}"/> 
      </GridView> 
     </ListView> 

     <GridSplitter x:Name="gridSplitter" Grid.Row="1" 
      ResizeDirection="Rows" Background="Gray" 
      Height="4" HorizontalAlignment="Stretch" 
      Style="{StaticResource gridSplitterStyle}"/> 

     <RichTextBox x:Name="rowView" Grid.Row="2" 
      BorderBrush="Bisque" VerticalAlignment="Stretch" 
      IsReadOnly="True" Background="YellowGreen" 
      FontFamily="Comic Sans Serif"/> 


     <ToggleButton x:Name="rbWorkingCopy" 
      Template="{StaticResource ToggleButtonControlTemplate}" 
      Grid.Row="3" Width="100" Height="22" 
      Content="{StaticResource WorkingCopyTitle}" 
      HorizontalAlignment="Left" VerticalAlignment="Bottom" 
      Command="repoManager:AppCommands.GetWorkingCopyInfoCommand" /> 
     <ToggleButton x:Name="rbRepository" 
      Template="{StaticResource ToggleButtonControlTemplate}" 
      Grid.Row="3" Width="100" Height="22" 
      Content="{StaticResource RepositoryTitle}" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Bottom" Margin="120,0,0,0" 
      Command="repoManager:AppCommands.GetRepoInfoCommand" /> 
     <ProgressBar x:Name="checkRepositoryProgress" Grid.Row="3" 
      Width="220" Height="22" HorizontalAlignment="Right" 
      VerticalAlignment="Bottom" Margin="250,0,10,0" 
      IsIndeterminate="True" 
      IsEnabled="{Binding repoManager:ExecutingCommand}" /> 
    </Grid> 
</DataTemplate> 

此代碼porgrammatically應用到給定的TabItem對象在以下方式:

​​

後,我需要訪問中的DataTemplate聲明的ListView控件元素,所以我執行在網上發現身邊的代碼,並也在這個網站上。下面是一個簡單的例子:

/* Getting the ContentPresenter of myListBoxItem*/   
ContentPresenter myContentPresenter = 
    FindVisualChild<ContentPresenter>(this); 

// this.GetVisualChild(0) 
/* Finding textBlock from the DataTemplate that is set on that ContentPresenter*/ 
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; 

ListView repoListView = (ListView)myDataTemplate.FindName("repoView", 
    myContentPresenter); 

問題1:在這種情況下的ContentTemplate ContentPresenter的爲Null,所以代碼執行崩潰。 Prolem2:好吧,我想,可能是我需要直接導航拋TabItem的內容,所以代碼變得或多或少:

/* Getting the ContentPresenter of myListBoxItem*/   
ContentPresenter myContentPresenter = 
    FindVisualChild<ContentPresenter>(this); 

// this.GetVisualChild(0) 
/* Finding textBlock from the DataTemplate that is set on that ContentPresenter*/ 
DataTemplate myDataTemplate = this.ContentTemplate; 

ListView repoListView = (ListView)myDataTemplate.FindName("repoView", 
    myContentPresenter); 

是TabItem的對象。但是平板的東西,這個的ContentTemplate是完全不同於上面指定的。我確定我錯過了某個地方,你能幫我弄清楚這個問題嗎? 謝謝。

回答

0

好吧,我們來了:) 我解決了這個問題,不是很好的方式,但它似乎工作正常。 正如我上面提到的,我使用LoadContent方法,它返回ListView對象,但順便說它不是UI實際使用的ListView。所以爲了解決這個問題,我添加了靜態屬性來保存我的REAL ListView對象(靜態,因爲我有單個DataTemplate包含ListView在多個TabItems之間共享,因此ListView也是共享的),並將事件處理程序添加到我的DataTemplate - >加載。抓住這個事件,在我的情況下,只在應用程序的生命週期中引發,RoutedEvent的OriginalSource我得到了WPF引擎用於在UI上呈現的REAL ListView對象。 希望我的解決方案能幫助別人。 謝謝大家。

0

您不想使用TabItem的任何模板屬性,因爲這些屬性用於創建實際控件,而不是存儲它們。您應該能夠直接在視覺樹中搜索ListView,而不是通過DataTemplate

+0

當然可以。通過調用ControlTemplate LoadContent()的賦值,我可以解決這個問題,在我的具體情況下返回Grid,這是我的DataTemplate的根。我的困惑是,爲什麼ContentPresenter不包含任何內容?在互聯網上找到的示例代碼中,DataTemplate中沒有任何明確的ContentPresenter聲明。最後,我稍微改變了我的代碼結構,以便以其他方式接受我需要的數據,我也更簡單:)順便說一句,直到現在我沒有找到解決這類問題的方法。 – Tigran 2009-08-15 08:44:13

+0

我注意到的一件事是,導航引發示例代碼,他們通常將父元素的DataTemplate應用於Item。所以我試圖應用TabControl的ItemTemplate屬性(即使它對這個應用程序沒有那麼方便的方法,但只是爲了試圖理解這個問題),但它並沒有工作。 – Tigran 2009-08-15 08:44:56

0

簡單地說,如果你有一個DataGrid,幷包含一個數據模板TemplateColumn,可以使用下面的代碼示例:

<DataGridTemplateColumn x:Name="photoPathColumn" Header="{x:Static resx:FrmResource.Photo}" Width="Auto"> 
    <DataGridTemplateColumn.CellEditingTemplate x:Uid="keyelm"> 
     <DataTemplate x:Name="dodo"> 
      <StackPanel Orientation="Horizontal" Height="Auto"> 
       <TextBlock x:Name="photo" x:Uid="imageFile" Text="{Binding Path=PhotoPath}"></TextBlock> 
       <Button x:Name="Browse" Content="..." Click="Browse_Click"></Button> 
      </StackPanel> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 

TextBlock tBlock = (TextBlok)photoPathColumn.CellEditingTemplate.FindName(
         "photo", 
         photoPathColumn.GetCellContent(CustomersDataGrid.CurrentItem)); 
  • 哪裏photo是文本塊的名稱
  • 在哪裏photoPathColumnDataGridTemplateColumn
+1

它引發異常。 – Shimmy 2010-11-24 15:07:13