查找放置在ListView Wpf中的控件(Find Controls placed inside ListView Wpf)

编程入门 行业动态 更新时间:2024-10-05 17:20:57
查找放置在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放在GridView , GridView放在ListView中。

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

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

<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>

I need to find DataGrid dgIssuedItemsBatchDetails and then bind. That DataGrid is placed inside GridView and that GridView is placed inside ListView.

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

By using this code I am able to find the GridView. My DataGrid is placed inside GridView DataTemplate. So suggest me how I can find my DataGrid from code behind.

最满意答案

它可以通过使用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; }

It can be achieved by using VisualTreeHelper. As MSDN says:

VisualTreeHelper class provides utility methods that perform common tasks involving nodes in a visual tree.

So let me show an example how it can be achieved:

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) returns 0 cause ListView is created, but not yet loaded. Particularly, the DataTemplate has not yet been applied to the ListView, consequently there is nothing in the Visual Tree. Then use this method to get your DataGrid on Loaded event of your Window:

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

Update:

To find a control per item in ListView:

Create a SelectionChanged event:

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"); } }

and a method which can find a necessary control for you:

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; }

更多推荐

Grid,DataGrid,Name,电脑培训,计算机培训,IT培训"/> <meta name="descriptio

本文发布于:2023-07-19 15:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1182593.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:控件   Wpf   ListView   Find   Controls

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!