Silverlight 2.0 中,DataGrid得到模板列中的按钮,并得到所点击的行号和键值 以及 实体对象
通过Tag属性可以设置自定义的数据:
(1)借助LoadingRow事件,在初始化DataGrid过程中 使用GetCellContent方法,它可以到单元格内的控件。这时,你也就可以得到你点击的是哪一行了,你可以选择将适当的信息赋给该行的Button的Tag属性; 然后在单击button 按钮时,就可以对该信息进行读取和使用了:
(2)如果你不关心在某一行,而很需要得到改行绑定的实体。那么,你可以在定义Button的时候,将Button的Tag属性直接进行空绑定,可以将该该行绑定的实体对象赋值给Tag,那么在单击Button时,就可以直接使用该对象了。
这样,点击的操作就很灵活了,也可以解决很多问题了。
XAML 脚本:
<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="600" Height="Auto">
<Grid x:Name="LayoutRoot" Background="White">
<ScrollViewer VerticalScrollBarVisibility="Auto" BorderThickness="1" BorderBrush="Gray">
<StackPanel Margin="10">
<data:DataGrid x:Name="gridDataList" AutoGenerateColumns="False" LoadingRow="DataGrid_LoadingRow" Height="200" Margin="0 5 0 10">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="序号" Width="80" Binding="{Binding Index}"/>
<data:DataGridTextColumn Header="姓名" Width="100" Binding="{Binding Name}"/>
<data:DataGridTextColumn Header="地址" Width="260" Binding="{Binding Address}"/>
<data:DataGridTemplateColumn Header="功能按钮" Width="120">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="Button" Width="50" Content="初始化内容" Height="21" Tag="{Binding}" Click="Button_Click"></Button>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>
<TextBlock x:Name="msg"></TextBlock>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="600" Height="Auto">
<Grid x:Name="LayoutRoot" Background="White">
<ScrollViewer VerticalScrollBarVisibility="Auto" BorderThickness="1" BorderBrush="Gray">
<StackPanel Margin="10">
<data:DataGrid x:Name="gridDataList" AutoGenerateColumns="False" LoadingRow="DataGrid_LoadingRow" Height="200" Margin="0 5 0 10">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="序号" Width="80" Binding="{Binding Index}"/>
<data:DataGridTextColumn Header="姓名" Width="100" Binding="{Binding Name}"/>
<data:DataGridTextColumn Header="地址" Width="260" Binding="{Binding Address}"/>
<data:DataGridTemplateColumn Header="功能按钮" Width="120">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="Button" Width="50" Content="初始化内容" Height="21" Tag="{Binding}" Click="Button_Click"></Button>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>
<TextBlock x:Name="msg"></TextBlock>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
后置代码:
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
gridDataList.ItemsSource = Customer.GetSampleCustomerList();
}
private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
Customer bindData = (Customer)e.Row.DataContext;
Button btn = gridDataList.Columns[3].GetCellContent(e.Row).FindName("Button") as Button;
btn.Content = bindData.Name;
//btn.Tag = bindData.Index + "," + e.Row.GetIndex();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
Customer c = b.Tag as Customer;
msg.Text = "你选择" + c.Name + "的Index是:" + c.Index + ",它位于 DataGrid 的第 " + c.Index + " 行";
//string[] t = b.Tag.ToString().Split(',');
//msg.Text = "你选择的值是:" + t[0] + " 是 DataGrid 的第 " + t[1] + " 行";
}
}
/// <summary>
/// 数据对象
/// </summary>
public class Customer
{
public Int32 Index { get; set; }
public String Name { get; set; }
public String Address { get; set; }
public Customer(Int32 indexName, String userName, String address)
{
this.Index = indexName;
this.Name = userName;
this.Address = address;
}
public static List<Customer> GetSampleCustomerList()
{
//示例数据
List<Customer> data = new List<Customer>();
for (int i = 0; i < 10; i++)
{
data.Add(new Customer(i * i, "Jack 之" + i.ToString(), "地址之" + i.ToString()));
}
return data;
}
}
{
public Page()
{
InitializeComponent();
gridDataList.ItemsSource = Customer.GetSampleCustomerList();
}
private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
Customer bindData = (Customer)e.Row.DataContext;
Button btn = gridDataList.Columns[3].GetCellContent(e.Row).FindName("Button") as Button;
btn.Content = bindData.Name;
//btn.Tag = bindData.Index + "," + e.Row.GetIndex();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
Customer c = b.Tag as Customer;
msg.Text = "你选择" + c.Name + "的Index是:" + c.Index + ",它位于 DataGrid 的第 " + c.Index + " 行";
//string[] t = b.Tag.ToString().Split(',');
//msg.Text = "你选择的值是:" + t[0] + " 是 DataGrid 的第 " + t[1] + " 行";
}
}
/// <summary>
/// 数据对象
/// </summary>
public class Customer
{
public Int32 Index { get; set; }
public String Name { get; set; }
public String Address { get; set; }
public Customer(Int32 indexName, String userName, String address)
{
this.Index = indexName;
this.Name = userName;
this.Address = address;
}
public static List<Customer> GetSampleCustomerList()
{
//示例数据
List<Customer> data = new List<Customer>();
for (int i = 0; i < 10; i++)
{
data.Add(new Customer(i * i, "Jack 之" + i.ToString(), "地址之" + i.ToString()));
}
return data;
}
}
基于Silverlight 2.0正式版。