WPF的listview如何获取指定项的单元格

qq37019736 2015-10-24 08:26:12
xaml的代码

<DataTemplate x:Key="isAuditeCheckDt">
<CheckBox x:Name="isAuditeCheck" IsChecked="{Binding isCheck}" Content="{Binding isCheck}" ></CheckBox>
</DataTemplate>

<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path=userName}" Header="用户名"
Width="100"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=type}" Header="类型"
Width="150"/>
<GridViewColumn CellTemplate="{StaticResource isAuditeCheckDt}" Header="是否审计"
Width="108"/>
</GridView>
</ListView.View>

我该如何获得Checkbox的单元格,我想在初始化时让前三个,或者指定的三个item的Checkbox的isenabled变成false
百度了好久找不到资料啊,找到个类似的用
 private UIElement GetListViewCellControl(int rowIndex, int cellIndex)
{
// rowIndex and cellIndex base is 0.
// First Get ListViewItem
UIElement u = listView.ItemContainerGenerator.ContainerFromIndex(rowIndex) as UIElement;
if (u == null) return null;

// Seartch Unit In ListViewItem
while ((u = (VisualTreeHelper.GetChild(u, 0) as UIElement)) != null)
{
if (u is GridViewRowPresenter)
{
return VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(u, cellIndex), 0) as UIElement;
}
}

return u;
}
这个函数,但调试了一下发现没有获取到。类似的还有

foreach (users user in listView.Items)
{
ListViewItem lvi = this.listView.ItemContainerGenerator.ContainerFromItem(user) as ListViewItem;
CheckBox cb = FindVisualChild<CheckBox>(lvi);
cb.IsEnabled = false;
}
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;

}
但是都不行啊!!!都编译通过但是获取不到checkbox啊!!!为什么,求大神解答
...全文
255 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq37019736 2015-10-26
  • 打赏
  • 举报
回复
 private void isAuditeCheck_Loaded(object sender, RoutedEventArgs e)
        {
            CheckBox tb = e.OriginalSource as CheckBox;
            ContentPresenter cp = tb.TemplatedParent as ContentPresenter;
            users user = cp.Content as users;
            if (user.userName == "admin" || user.userName == "auditor" || user.userName == "security")  //如果是这三个用户不允许修改isCheck
            {
                ListViewItem lvi = this.listView.ItemContainerGenerator.ContainerFromItem(user) as ListViewItem;
                CheckBox cb = FindVisualChild<CheckBox>(lvi);
                cb.IsEnabled = false;
            }
        }
我已经会了,还是谢谢二楼
exception92 2015-10-25
  • 打赏
  • 举报
回复
初始化时让前三个,或者指定的三个item的Checkbox的isenabled变成false ->根本不需要遍历什么控件方式。既然使用了Binding 就使用binding方式。 在VM中设定方式,遍历绑定的数据源,再设置一个bool变量来binding到isEnabled上根据条件设定 改变isenabled的值。

110,533

社区成员

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

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

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