Найти элемент в DataTemplate применяется к TabItem

голоса
0

У меня проблема, пытаясь найти элемент, объявленный в 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;

После того, как я нужен доступ к ListView элемент, объявленный в DataTemplate, так что я исполняю коды, найденные вокруг в Интернете, а также на этом сайте. Вот небольшой пример:

/* 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. Но Strage вещь, что ContentTemplate из этого совершенно отличается от того, присвоенных выше. Я уверен , что я пропустил что - то где - то, вы можете мне помочь , чтобы выяснить проблему? Спасибо.

Задан 14/08/2009 в 21:06
источник пользователем
На других языках...                            


3 ответов

голоса
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«s TemplateColumn.
Ответил 17/08/2010 в 03:47
источник пользователем

голоса
0

Хорошо, здесь мы приходим :) Я решить эту проблему, в не очень хороший способ, но мне кажется , что работает правильно. Как я уже говорил выше , я использовал метод LoadContent и возвращает мне объект ListView, но , как он не был ListView , что на самом деле использует пользовательский интерфейс. Таким образом , чтобы решить эту проблему , я добавить статическое свойство удерживать мой реальный объект ListView (статические , как у меня есть единственный DataTemplate , который содержит ListView совместно по несколько TabItems, поэтому ListView общей тоже) и добавить обработчик события к моей DataTemplate -> Loaded . Ловля этого события, что в моем случае вызывает только те , в жизни приложения, в RoutedEvent в OriginalSource я получил реальный объект ListView , что WPF использует движок для рендеринга на UI. Надеюсь , что мое решение поможет кому - то. Спасибо вам всем.

Ответил 23/08/2009 в 00:15
источник пользователем

голоса
0

Вы не хотите использовать какой - либо из свойств Шаблон TabItem, так как те , которые используются для создания фактического контроля, а не хранить их. Вы должны быть в состоянии найти визуальное дерево для ListViewнепосредственно, а не через DataTemplate.

Ответил 14/08/2009 в 22:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more