求助一个WPF ListView 的问题,被卡住了

阿浩No_1 2017-06-29 12:03:37
<Grid>
<ListView>
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock x:Name="testA" Text="123"/>
<TextBlock x:Name="testB" Text="456"/>
<TextBlock x:Name="testC" Text="789"/>
</WrapPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Grid>

private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is ChildType)
{
return child as ChildType;
}
else
{
ChildType childOfChildren = FindVisualChild<ChildType>(child);
if (childOfChildren != null)
{
return childOfChildren;
}
}
}
return null;
}

两个问题:1,三个textblock 无法在listview 里显示出来;2,我用上面这段后台后台代码无法读取到 Listview 下的三个textblock 的值。想问问怎么解决?被卡住了
...全文
191 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿浩No_1 2017-06-29
  • 打赏
  • 举报
回复
我明白了。楼主的方法可行。只是因为我把调用的代码放到 初始化 代码段里了,所以一直异常(估计是因为初始化的时候,控件还未加载)。谢谢啦
exception92 2017-06-29
  • 打赏
  • 举报
回复
引用 3 楼 terry1021_82 的回复:
再问一下版主。 我在ListView.View前增加了ListViewItem后,textblock能够显示出来了。 <ListView x:Name="lcn"> <ListViewItem></ListViewItem> <ListView.View> 但用FindVisualChild来获取模板里的textblock时,还是获取不到。一直报 tb 是 null TextBlock tb = FindVisualChild<TextBlock>(lcn); MessageBox.Show(tb.Text);
用链接中的获取子元素的方式获取,指定名称或者获取到集合。 http://blog.csdn.net/duanzi_peng/article/details/17094639
exception92 2017-06-29
  • 打赏
  • 举报
回复
你怎么把gridview的内容又放到listboxitem里的??应该放到listview.view节点里,就是你问题里描述的那样。我只是让你指定了listviewitem的name属性,然后传给那个方法调用就行了!
exception92 2017-06-29
  • 打赏
  • 举报
回复
VisualTreeHelper 用来操作“可视”的元素,
引用 3 楼 terry1021_82 的回复:
再问一下版主。 我在ListView.View前增加了ListViewItem后,textblock能够显示出来了。 <ListView x:Name="lcn"> <ListViewItem></ListViewItem> <ListView.View> 但用FindVisualChild来获取模板里的textblock时,还是获取不到。一直报 tb 是 null TextBlock tb = FindVisualChild<TextBlock>(lcn); MessageBox.Show(tb.Text);
晕,,你有三个TextBlock,你清楚上边的代码 到底查询的是哪一个?? 很明显你从lcn这个范围查询是不对的。 既然是cellTemplate了,那就从ListViewitem这个范围来查询。
阿浩No_1 2017-06-29
  • 打赏
  • 举报
回复
再问一下版主。 我在ListView.View前增加了ListViewItem后,textblock能够显示出来了。 <ListView x:Name="lcn"> <ListViewItem></ListViewItem> <ListView.View> 但用FindVisualChild来获取模板里的textblock时,还是获取不到。一直报 tb 是 null TextBlock tb = FindVisualChild<TextBlock>(lcn); MessageBox.Show(tb.Text);
exception92 2017-06-29
  • 打赏
  • 举报
回复
1,三个textblock 无法在listview 里显示出来; -》 只设置了 CellTemplate ,当时没有项,也就是ListViewItem。在ListView中增加ListViewItem,类似:

//...省略部分代码
</ListView.View>
<ListViewItem></ListViewItem>
</ListView>
或者增加 GridViewColumn(要指定ItemsSource数据源),类似: <GridViewColumn Header="xx" DisplayMemberBinding="{Binding Path=xxx}"></GridViewColumn> 2,我用上面这段后台后台代码无法读取到 Listview 下的三个textblock 的值。 -》因为你item没有显示,所以不能作为“可视树”结构的一部分就查询不到。
shoppo0505 2017-06-29
  • 打赏
  • 举报
回复
这个嵌套不对吧,第一层grid下面要有个column啊。 你别自己写代码,用图形界面编辑。自己写多层嵌套很容易出问题。
阿浩No_1 2017-06-29
  • 打赏
  • 举报
回复
<Grid> <ListView x:Name="lcn"> <ListViewItem x:Name="v1"> <GridView> <GridView.Columns> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <WrapPanel> <TextBlock x:Name="testB" Text="456"/> <!--<TextBlock x:Name="testC" Text="789"/>--> </WrapPanel> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView.Columns> </GridView> </ListViewItem> </ListView> </Grid> public Window2() { InitializeComponent(); TextBlock tb = FindVisualChild<TextBlock>(v1); MessageBox.Show(tb.Text); } private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : FrameworkElement   { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is ChildType) { return child as ChildType; } else { ChildType childOfChildren = FindVisualChild<ChildType>(child); if (childOfChildren != null) { return childOfChildren; } } } return null; } 代码如上,结果如下。真是搞不懂了。。。
exception92 2017-06-29
  • 打赏
  • 举报
回复
晕,GetChildObjects<TextBlock>(vvv); 参数应该是 <ListViewItem x:Name="v1"> </ListViewItem> 中的v1,是item的name,不是GridView的vvv。 GridView 只是定义视图显示格式,最终是要“显示” 到ListViewItem中的。
阿浩No_1 2017-06-29
  • 打赏
  • 举报
回复
<Grid> <ListView x:Name="lcn"> <ListViewItem x:Name="v1"> </ListViewItem> <ListView.View> <GridView x:Name="vvv"> <GridView.Columns> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <WrapPanel> <TextBlock x:Name="testA" Text="123"/> </WrapPanel> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView.Columns> </GridView> </ListView.View> </ListView> </Grid> public Window2() { InitializeComponent(); //TextBlock tb = FindVisualChild<TextBlock>(v1); //MessageBox.Show(tb.Text); List<TextBlock> lst = GetChildObjects<TextBlock>(vvv); MessageBox.Show(lst.Count.ToString()); } private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : FrameworkElement   { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is ChildType) { return child as ChildType; } else { ChildType childOfChildren = FindVisualChild<ChildType>(child); if (childOfChildren != null) { return childOfChildren; } } } return null; } /// <summary>   /// 获得指定元素的所有子元素   /// </summary>   /// <typeparam name="T"></typeparam>   /// <param name="obj"></param>   /// <returns></returns>   public List<T> GetChildObjects<T>(DependencyObject obj) where T : FrameworkElement { DependencyObject child = null; List<T> childList = new List<T>(); for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++) { child = VisualTreeHelper.GetChild(obj, i); if (child is T) { childList.Add((T)child); } childList.AddRange(GetChildObjects<T>(child)); } return childList; }  看得到 “123”,就是取不到。。。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧