获取ItemsControl里面的控件

来源:互联网 发布:网络布线按米收费吗 编辑:程序博客网 时间:2024/05/16 10:04

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虚拟化。

0 0
原创粉丝点击