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。

 

 

 


本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2011/09/09/2172370.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值