我在嘗試查找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是完全不同於上面指定的。我確定我錯過了某個地方,你能幫我弄清楚這個問題嗎? 謝謝。
當然可以。通過調用ControlTemplate LoadContent()的賦值,我可以解決這個問題,在我的具體情況下返回Grid,這是我的DataTemplate的根。我的困惑是,爲什麼ContentPresenter不包含任何內容?在互聯網上找到的示例代碼中,DataTemplate中沒有任何明確的ContentPresenter聲明。最後,我稍微改變了我的代碼結構,以便以其他方式接受我需要的數據,我也更簡單:)順便說一句,直到現在我沒有找到解決這類問題的方法。 – Tigran 2009-08-15 08:44:13
我注意到的一件事是,導航引發示例代碼,他們通常將父元素的DataTemplate應用於Item。所以我試圖應用TabControl的ItemTemplate屬性(即使它對這個應用程序沒有那麼方便的方法,但只是爲了試圖理解這個問題),但它並沒有工作。 – Tigran 2009-08-15 08:44:56