查找DataTemplate中的元素应用到TabItem的(Find an element in D

2019-08-01 07:10发布

我试图找到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>

此代码porgrammatically施加到下面的方式在给定的TabItem对象:

this.ContentTemplate = FindResource("TabItemDataTemplate") as DataTemplate;

之后,我需要访问中的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:在这种情况下ContentPresenter的的ContentTemplate为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的对象。 但strage的事情,那将是的ContentTemplate从一个以上的分配完全不同。 我敢肯定,我错过了什么地方,你可以帮我找出这个问题? 谢谢。

Answer 1:

你不希望使用任何的模板性质的TabItem ,因为这些被用来创建实际控制,而不是将它们存储。 你应该能够搜索可视化树的ListView直接,而不是通过持续DataTemplate



Answer 2:

好了,下面我们就来:)我解决这个问题,不是很好的方式,但它似乎正常工作。 正如我上面提到我用LoadContent方法,并返回我的ListView的对象,但顺便说一下这是不是UI实际使用ListView。 因此,要解决这个问题,我添加静态属性来保存我真正的ListView对象(如静我有一个包含多个共享的TabItems的ListView单一的DataTemplate,所以ListView的共享太)和事件处理程序添加到我的DataTemplate - > 加载 。 追赶这个事件,在我的情况下,提高了应用程序的生命周期唯一的,在RoutedEvent的 OriginalSource我得到了真正的ListView对象WPF引擎用于渲染UI上。 希望我的解决方案将帮助别人。 谢谢你们。



Answer 3:

简单地说,如果你有一个DataGridTemplateColumn包含数据的模板,你可以使用下面的代码示例:

<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


文章来源: Find an element in DataTemplate applied to TabItem