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,如需转载请自行联系原作者