您的位置:首页 > 其它

获取ItemsControl里面的控件

2016-06-28 19:03 106 查看
ItemsControl通过Binding获得数据,每个数据的模板在DataTemplate里面,直接查找DateTemplate里的控件获取不到。可以在ItemsControl的ItemContainerGenerator.StatusChanged时间里通过下列方法获得。

this.itemsControl.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (this.itemsControl.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
this.itemsControl.ItemContainerGenerator.StatusChanged -= ItemContainerGenerator_StatusChanged;
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.DataBind, new Action(DelayedAction));
}
}

void DelayedAction()
{
for (int i = 0; i < this.itemsControl.Items.Count; i++)
{
var item = this.itemsControl.ItemContainerGenerator.ContainerFromIndex(i);
StackPanel stackPanel = VisualTreeExHelper.FindSingleVisualChildren<StackPanel>(item);
dateTimePicker.popupCalender1.IsOpen = false;
}

}


此处的itemsControl为ItemsControl的Name,FindSingleVisualChildren为自己写的搜索子控件的方法。

public static T FindSingleVisualChildren<T>(DependencyObject parentObj) where T : DependencyObject
{
T result = null;
if (parentObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parentObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parentObj, i);
if (child != null && child is T)
{
result = child as T;
break;
}
result = FindSingleVisualChildren<T>(child);
if (result != null)
break;
}
}
return result;
}


上面介绍的方法不支持ItemsControl虚拟化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控件