WPF 获得DataTemplate中的控件

1、WPF 获得DataTemplate中的控件, 下面这个示例是从ListBox中获得ListBoxItem模板的控件信息。

前台代码:

 <!--获得模板中的控件-->
        <ListBox  Margin="12,32,0,0" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Name="listBox1" SelectedIndex="0" Height="186" VerticalAlignment="Top" HorizontalAlignment="Left" Width="287">
            <ListBox.ItemTemplate>
                <DataTemplate x:Name="gridDataTemplate">           
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.5*"/>
                            <ColumnDefinition Width="0.5*"/>
                            <ColumnDefinition Width="0.5*"/>
                            <ColumnDefinition Width="0.5*"/>
                        </Grid.ColumnDefinitions>  
                        <TextBlock Text="{Binding Path=ID}"/>
                        <TextBlock Grid.Column="1" x:Name="myName" Text="{Binding Path=Name}"/>
                        <TextBlock Grid.Column="2" Text="{Binding Path=Age}" Background="{Binding Path=Age, Converter={StaticResource BackgroundConverter}}"/>
                        <CheckBox Grid.Column="3" x:Name="myCheckBox" IsChecked="{Binding Path= ISBoy, Converter={StaticResource BoolConverter}}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

 资源:

 <Window.Resources>
        <Con:BackgroundConverter x:Key="BackgroundConverter"/>
        <Con:BoolConverter x:Key="BoolConverter"/>
 </Window.Resources>

  

  <Button Height="23" HorizontalAlignment="Left" Margin="35,251,0,0" Name="button1" VerticalAlignment="Top" Width="209" Click="button1_Click">GetControlFromDataTemplate</Button>

  

后台代码:

       public Window1()
        {
            InitializeComponent();
          
            listBox1.DataContext = GetDataTable();
               
         }

 Click事件:关键代码

       private void button1_Click(object sender, RoutedEventArgs e)
        {

            ListBoxItem myListBoxItem = (ListBoxItem)listBox1.ItemContainerGenerator.ContainerFromItem(listBox1.SelectedItem);
            ContentPresenter contentpresenter = FindFirstVisualChild<ContentPresenter>(myListBoxItem);
            DataTemplate MyDataTemplate = contentpresenter.ContentTemplate;
            TextBlock myTextBlock = MyDataTemplate.FindName("myName", contentpresenter) as TextBlock;
            if (myTextBlock != null)
            {
                MessageBox.Show(myTextBlock.Text);
            }

      }

  

数据源:当然也可以自己连接数据库获得数据源

   private DataTable  GetDataTable()
        {
            DataTable data = new DataTable("MyDataTable");
            
            DataColumn ID = new DataColumn("ID");//第一列
            ID.DataType = System.Type.GetType("System.Int32");
            //ID.AutoIncrement = true; //自动递增ID号 
            data.Columns.Add(ID);

            //设置主键
            DataColumn[] keys = new DataColumn[1];
            keys[0] = ID;
            data.PrimaryKey = keys;

            data.Columns.Add(new DataColumn("Name",typeof(string)));//第二列
            data.Columns.Add(new DataColumn("Age",typeof(string)));//第三列
            data.Columns.Add(new DataColumn("ISBoy", typeof(Int16)));//第三列

            data.Rows.Add(1,"  XiaoM","  20", 1);
            data.Rows.Add(2,"  XiaoF","  122", 0);
            data.Rows.Add(3,"  XiaoA", "  29", 1);
            data.Rows.Add(4,"  XiaoB", "  102", 0);
            return data;
        }

  

值转换:BackgroundConverter类是改变颜色,BoolConverter是将Bool互相转换Int

 public class BackgroundConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color color = new Color();
            int num = int.Parse(value.ToString());
            if (num > 100)
                color = Colors.Yellow;
            else if (num < 50)
                color = Colors.LightGreen;
            else
                color = Colors.LightPink;
            return new SolidColorBrush(color);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
    public class BoolConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool flag = false;
           
            if (1 == int.Parse(value.ToString()))
            {
                flag = true;
            }

            if( 0 == int.Parse(value.ToString()))
                flag = false;

            return flag;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if ((bool)value)
            {
                return 1;
            }
            else
                return 0;
        }

        #endregion
    }

  

 //关键函数

  public T FindFirstVisualChild2<T>(DependencyObject obj, string childName) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
                {
                    return (T)child;
                }
                else
                {
                    T childOfChild = FindFirstVisualChild2<T>(child, childName);
                    if (childOfChild != null)
                    {
                        return childOfChild;
                    }
                }
            }
            return null;
        }

  

 效果图: 当选中第一项,然后单击"GetControlFromDataTemplate"按钮,则弹出第一项中控件的内容XiaoM。

原文地址:https://www.cnblogs.com/linlf03/p/2172370.html