我在尝试查找在DataTemplate中声明的元素时出现问题,之后将其作为ContentTemplate应用于TabItem对象。 我看到已经有一些关于这个问题的解决方案,但其中没有一个实际上适用于我的情况,我想理解为什么(显然我在某些地方犯了错误) 以下是示例代码:
<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>
此代码以下列方式以编程方式应用于给定的TabItem对象:
this.ContentTemplate = FindResource("TabItemDataTemplate") as DataTemplate;
在我需要访问DataTemplate中声明的ListView元素之后,我执行在Internet上找到的代码,以及在此站点上执行的代码。这是一个简短的例子:
/* 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:在这种情况下,ContentPresenter的 ContentTemplate 为空,因此代码执行崩溃。 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对象。但事实上, this 的ContentTemplate与上面指定的内容完全不同。我确定我错过了某个地方,你能帮我解决问题吗? 谢谢。
答案 0 :(得分:0)
您不想使用TabItem
的任何模板属性,因为这些属性用于创建实际控件,而不是存储它们。您应该能够直接在可见树中搜索ListView
,而不是通过DataTemplate
。
答案 1 :(得分:0)
好的,我们来了:) 我以不太好的方式解决了这个问题,但似乎工作正常。 正如我上面提到的,我使用了LoadContent方法,它返回了ListView对象,但顺便说一下,它不是UI实际使用的ListView。因此,为了解决这个问题,我添加静态属性来保存我的REAL ListView对象(静态,因为我有单个DataTemplate,包含跨多个TabItem共享的ListView,所以ListView也共享)并将事件处理程序添加到我的DataTemplate - &gt;的加载即可。抓住这个事件,在我的案例中只提出应用程序的生命周期,在 RoutedEvent的 OriginalSource 中,我获得了WPF引擎用于在UI上呈现的REAL ListView对象。 希望我的解决方案能帮助某人。 谢谢大家。
答案 2 :(得分: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
是文本块的名称photoPathColumn
是DataGrid
的{{1}}。