• 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。

  • 相关阅读:
    Linux虚拟机突然不能上网了
    项目经验不丰富、技术不突出的程序员怎么打动面试官?
    10分钟看懂!基于Zookeeper的分布式锁
    BATJ等大厂最全经典面试题分享
    分享30道Redis面试题,面试官能问到的我都找到了
    一个六年Java程序员的从业总结:比起掉发,我更怕掉队
    我是这样手写 Spring 的(麻雀虽小五脏俱全)
    自述:为什么一部分大公司还在采用过时的技术,作为技术人而言该去大公司还是小公司
    Java精选面试题之Spring Boot 三十三问
    Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
  • 原文地址:https://www.cnblogs.com/linlf03/p/2172370.html
Copyright © 2020-2023  润新知