zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节
    BZOJ 1692: [Usaco2007 Dec]队列变换 后缀数组 + 贪心
    luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描
    BZOJ2251 [2010Beijing Wc]外星联络 后缀数组 + Height数组
    [NOI2015]软件包管理器 树链剖分 + 线段树
    BZOJ [POI2004]PRZ 状压DP + 二进制 + 骚操作
    GIL与异步回调
    Event事件
    进程池与线程池
    队列
  • 原文地址:https://www.cnblogs.com/linlf03/p/2172370.html
Copyright © 2011-2022 走看看