繁体   English   中英

查找ListView Wpf中的控件

[英]Find Controls placed inside ListView Wpf

 <ListView Height="Auto"   Name="lstIndent" SelectionMode="Single" Grid.ColumnSpan="5"  HorizontalAlignment="Stretch" VerticalAlignment="Top" Grid.Row="0"   >
    <ListView.View >
       <GridView x:Name="dgIndentDetails" >
          <GridViewColumn Width="Auto"   >
             <GridViewColumn.CellTemplate>
                <DataTemplate>
                   <!--<GroupBox Header="Department Issue Header" Grid.Row="5" Grid.ColumnSpan="5"  HorizontalAlignment="Stretch"  >-->
                      <Grid>
                         <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                         </Grid.ColumnDefinitions>
                         <Grid.RowDefinitions>
                            <RowDefinition  Height="Auto"  />
                            <RowDefinition  Height="Auto"  />
                         </Grid.RowDefinitions>
                         <CheckBox Grid.Row="0" Grid.Column="0" IsChecked="{Binding Path=IsIndentIssue, UpdateSourceTrigger=PropertyChanged}" x:Name="chkbxIsChecked" HorizontalAlignment="Center"/>
                         <Label Grid.Column="1" Grid.Row="0" Content="{Binding ItemName}" x:Name="lbllstItemName" HorizontalAlignment="Center" ></Label>
                         <Label Grid.Column="2"  Grid.Row="0" Content="{Binding Quantity}" x:Name="lbllstQty" HorizontalAlignment="Center" ></Label>
                         <Label Grid.Column="3"  Grid.Row="0" Content="{Binding IssueQuantity}" x:Name="lbllstIssuedQty" HorizontalAlignment="Center" ></Label>
                         <DataGrid  Height="Auto" Padding="10,10,10,10" Width="800" Grid.Row="1" Grid.ColumnSpan="5" Name="dgIssuedItemsBatchDetails"  AutoGenerateColumns="False"  HorizontalAlignment="Stretch" VerticalAlignment="Center">
                            <DataGrid.Columns>                                                                 
                               <DataGridTextColumn Binding="{Binding ItemName}">                                                                     
                                  <DataGridTextColumn.Header>                                                                         
                                     <TextBlock Text="ItemName"/>                                                                    
                                  </DataGridTextColumn.Header>                                                                
                               </DataGridTextColumn>                                                                 
                               <DataGridTextColumn Binding="{Binding BatchNo}">
                                   <DataGridTextColumn.Header>
                                      <TextBlock Text="BatchNo"/>
                                   </DataGridTextColumn.Header>       
                               </DataGridTextColumn>                                                                 
                               <DataGridTextColumn Binding="{Binding Quantity}">
                                  <DataGridTextColumn.Header>                                                                         
                                    <TextBlock Text="Quantity"/>                                                                    
                                  </DataGridTextColumn.Header>
                               </DataGridTextColumn>
                           </DataGrid.Columns>
                          </DataGrid>
                       </Grid>
                    <!--</GroupBox>-->
                 </DataTemplate>
              </GridViewColumn.CellTemplate>
          </GridViewColumn>
       </GridView>
    </ListView.View>
 </ListView>

我需要找到DataGrid dgIssuedItemsBatchDetails然后绑定。 DataGrid放在GridViewGridView放在ListView中。

GridView grdvwIssueDetail = (GridView)lstIndent.FindName("dgIndentDetails");

通过使用此代码,我能够找到GridView 我的DataGrid放在GridView DataTemplate中。 所以建议我如何从代码后面找到我的DataGrid

它可以通过使用VisualTreeHelper来实现。 正如MSDN所说:

VisualTreeHelper类提供实用程序方法,这些方法执行涉及可视树中节点的常见任务。

那么让我举一个例子来说明它是如何实现的:

    private void SeeTheChild()
    {
        DataGrid myCombo = GetVisualChildInDataTemplate<DataGrid>(lstIndent);            
    }
    private T GetVisualChildInDataTemplate<T>(DependencyObject parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChildInDataTemplate<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }

VisualTreeHelper.GetChildrenCount(parent)返回0因为ListView已创建,但尚未加载。 特别是, DataTemplate尚未应用于ListView ,因此Visual Tree中没有任何内容。
然后使用此方法在Window Loaded事件上获取DataGrid

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    SeeTheChild();
}

更新:

要在ListView查找每个项目的ListView

创建SelectionChanged事件:

private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ItemContainerGenerator generator = this.listView.ItemContainerGenerator;
   ListBoxItem selectedItem = (ListBoxItem)generator.ContainerFromIndex(listView.SelectedIndex);
   Label aLabel = GetChildrenByType(selectedItem, typeof(Label), "label") as Label;
   if (aLabel != null)
   {
      MessageBox.Show("We've found Label with name 'label': " + aLabel.Content);
   }
   else
   {
      MessageBox.Show("There is no such Label");
   }
}

以及一种可以为您找到必要控制的方法:

public static Visual GetChildrenByType(Visual visualElement, Type typeElement, string nameElement)
{
   if (visualElement == null) return null;
   if (visualElement.GetType() == typeElement)
     {
        FrameworkElement fe = visualElement as FrameworkElement;
        if (fe != null)
        {
          if (fe.Name == nameElement)
          {
             return fe;
          }
        }
     }
     Visual foundElement = null;
     if (visualElement is FrameworkElement)
        (visualElement as FrameworkElement).ApplyTemplate();
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visualElement); i++)
     {
        Visual visual = VisualTreeHelper.GetChild(visualElement, i) as Visual;
        foundElement = GetChildrenByType(visual, typeElement, nameElement);
        if (foundElement != null)
           break;
     }
     return foundElement;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM