一、前台实现

在xaml里可以很轻松地实现一个如下图所示的DataGrid

<StackPanel>
<ComboBox Width="50" HorizontalAlignment="Left" SelectionChanged="ComboBox_SelectionChanged_1">
<ComboBoxItem Content="全部"></ComboBoxItem>
<ComboBoxItem Content="男"></ComboBoxItem>
<ComboBoxItem Content="女"></ComboBoxItem>
</ComboBox>
<DataGrid Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn>
<DataGridCheckBoxColumn.Header>
<CheckBox Click="CheckBox_Click_1"></CheckBox>
</DataGridCheckBoxColumn.Header>
</DataGridCheckBoxColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Ellipse Height="10" Width="10" Fill="{Binding FillColor}"></Ellipse>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="姓名" Width="100" Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTemplateColumn Header="性别" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<RadioButton Content="男" IsChecked="{Binding IsBoy}" Margin="5"></RadioButton>
<RadioButton Content="女" IsChecked="{Binding IsGirl}" Margin="5"></RadioButton>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="住址" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid Name="address">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Text="{Binding Address}" Grid.Column="0"></TextBox>
<Button Content="Csl" Grid.Column="1" Click="Button_Click_1"
Template="{StaticResource ButtonStyle}"></Button>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button Content="修改选中行的姓名" Template="{StaticResource ButtonStyle}"
Width="72" Height="23" Click="Button_Click_2"></Button>
</StackPanel>

二、几个主要的事件代码

1、CheckBox全选、反选:

        /// <summary>
/// 全选、反选
/// </summary>
/// <param name="value"></param>
private void ChangeIsChecked(bool value)
{
for (int i = ; i < this.dataGrid.Items.Count; i++)
{
DataGridRow row = (DataGridRow)this.dataGrid.ItemContainerGenerator.ContainerFromIndex(i);
if (row != null)
{
FrameworkElement fe = this.dataGrid.Columns[].GetCellContent(row);
if (fe != null)
{
CheckBox chk = fe as CheckBox;
if (chk.IsChecked.Value == !value)
{
chk.IsChecked = value;
}
}
}
}
}
2、ComboBox筛选:
        private ICollectionView view;
/// <summary>
/// 筛选
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
this.view = CollectionViewSource.GetDefaultView(this.students);
switch ((sender as ComboBox).SelectedIndex)
{
case :
this.view.Filter = x => true;
break;
case :
this.view.Filter = x => (x as Student).IsBoy;
break;
case :
this.view.Filter = x => (x as Student).IsGirl;
break;
default:
break;
}
}

3、修改单元格内容:

        private void Button_Click_1(object sender, RoutedEventArgs e)
{
//获取指定的列
DataGridTemplateColumn column = this.dataGrid.Columns[] as DataGridTemplateColumn;
//获取指定的行与列相交位置的单元格
FrameworkElement element = column.GetCellContent(this.dataGrid.Items[this.dataGrid.SelectedIndex]);
Grid grid = column.CellTemplate.FindName("address", element) as Grid;
if (grid != null)
{
TextBox textBox = grid.Children[] as TextBox;
MessageBox.Show(textBox.Text);
}
}

三、后台实现

一般用于动态生成Column,其实现过程相对要复杂一些。如果某一列在其单元格中承载的是模板,那么其创建的流程为:

1、创建模板FrameworkElementFactory;

2、设置模板的依赖项属性及数据绑定,添加子项;

3、把模板赋给DataTemplate.VisualTree;

4、把DataTemplate赋给DataGridTemplateColumn.CellTemplate;

5、把DataGridTemplateColumn添加到DataGrid.Columns

        /// <summary>
/// 生成地址列
/// </summary>
private void CreateColumnAddress()
{
DataGridTemplateColumn column = new DataGridTemplateColumn()
{
Header = "住址",
Width = 200.0
};
DataTemplate temp = new DataTemplate(); //生成Grid
FrameworkElementFactory grid = new FrameworkElementFactory(typeof(Grid));
grid.Name = "address";
//生成ColumnDefinition
FrameworkElementFactory c1 = new FrameworkElementFactory(typeof(ColumnDefinition));
FrameworkElementFactory c2 = new FrameworkElementFactory(typeof(ColumnDefinition));
c1.SetValue(ColumnDefinition.WidthProperty, new GridLength(, GridUnitType.Star));
c2.SetValue(ColumnDefinition.WidthProperty, new GridLength(, GridUnitType.Star)); grid.AppendChild(c1);
grid.AppendChild(c2); //生成TextBox
FrameworkElementFactory textBox = new FrameworkElementFactory(typeof(TextBox));
Binding binding = new Binding("Address");
textBox.SetBinding(TextBox.TextProperty, binding);
textBox.SetValue(Grid.ColumnProperty, ); //生成Button
FrameworkElementFactory button = new FrameworkElementFactory(typeof(Button));
button.SetValue(Button.ContentProperty, "Cls");
button.SetValue(Grid.ColumnProperty, );
button.SetValue(Button.TemplateProperty, this.FindResource("ButtonStyle"));
button.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click_1)); grid.AppendChild(textBox);
grid.AppendChild(button); temp.VisualTree = grid;
column.CellTemplate = temp; this.dataGrid.Columns.Add(column);
}

四、源码

DataGrid示例

WPF之DataGrid--列的前台及后台实现的更多相关文章

  1. wpf 当DataGrid列模版是ComboBox时,显示信息

    ​ 实际工作中,有时DataGrid控件某一列显示数据是从Enum集合里面选择出来的,那这时候设置列模版为ComboBox就能满足需求.而关于显示的实际内容,直接是Enum的string()返回值可能 ...

  2. WPF DataGrid列设置为TextBox控件的相关绑定

    在wpf的DataGrid控件中,某一列的数据模板为TextBox控件的话,绑定Text="{Binding TxtSn, UpdateSourceTrigger=PropertyChang ...

  3. WPF的DataGrid绑定ItemsSource后第一次加载数据有个别列移位的解决办法

    最近用WPF的DataGrid的时候,发现一个很弱智的问题,DataGrid的ItemsSource是绑定了一个属性: 然后取数给这个集合赋值的时候,第一次赋值,就会出现列移位 起初还以为是显卡的问题 ...

  4. 编写 WPF DataGrid 列模板,实现更好的用户体验

    Julie Lerman 下载代码示例 最近我在为一个客户做一些 Windows Presentation Foundation (WPF) 方面的工作. 虽然我提倡使用第三方工具,但有时也会避免使用 ...

  5. WPF DataGrid 列宽填充表格方法

    WPF中使DataGrid 列宽填充表格方法,设置ColumnWidth属性为ColumnWidth="*"即可. 源码: <DataGrid AutoGenerateCol ...

  6. WPF之DataGrid应用(转)

    原文:http://blog.csdn.net/sanjiawan/article/details/6785394 前几天打算尝试下DataGrid的用法,起初以为应该很简单,可后来被各种使用方法和功 ...

  7. WPF之DataGrid应用

    前几天打算尝试下DataGrid的用法,起初以为应该很简单,可后来被各种使用方法和功能实现所折磨.网络上的解决方法太多,但也太杂.没法子,我只好硬着头皮阅览各种文献资料,然后不断的去尝试,总算小有成果 ...

  8. WPF之DataGrid应用 翻页

    前几天打算尝试下DataGrid的用法,起初以为应该很简单,可后来被各种使用方法和功能实现所折磨.网络上的解决方法太多,但也太杂.没法子,我只好硬着头皮阅览各种文献资料,然后不断的去尝试,总算小有成果 ...

  9. WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选)

    原文:WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选) 前台代码 <DataGrid.Columns> <DataGridCheckB ...

  10. Working Experience - WPF 中 DataGrid 控件的应用

    问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...

随机推荐

  1. BZOJ3884 上帝与集合的正确用法(欧拉函数)

    设f(n)为模n时的答案,由2k mod n=2k mod φ(n)+φ(n) mod n(并不会证),且k mod φ(n)=f(φ(n)),直接就可以得到一个递推式子.记搜一发即可. #inclu ...

  2. C 类网络的子网快速划分

    CIDR ( Classless Inter-Domain Routing ,无类域间路由选择) 进行子网划分的方法有很多,最适合你的方式就是正确的方式.在 C 类地址中,只有 8 位用于定义主机.注 ...

  3. Argus UVALive - 3135(优先队列 水题一道)

    有一系列的事件,它每Period秒钟就会产生编号为qNum的事件,你的任务是模拟出前k个事件,如果多个事件同时发生,先处理qNum小的事件 今天再看看数据结构.. #include <iostr ...

  4. QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

    QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->ad ...

  5. java学习4-Maven的发布war并部署到tomcat

    1.点击生成-->Build Artifacts ,具体下图下图 2.生成完后会在target下出现一个war文件 3.部署到tomcat 复制war文件到tomcat/webapps,重启to ...

  6. Android 通过浏览器打开应用

    在很多应用的web站,其实都有这样一个功能,就是直接在网页中打开应用,接下来的就来探讨一下这个功能的实现,有些地方也我还没弄明白,还请懂的大神指点. 首先,得说一点不好消息,在微信中,这样的方式是行不 ...

  7. Classical Binary Search

    Find any position of a target number in a sorted array. Return -1 if target does not exist. 与题目 Firs ...

  8. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  9. 使用 css 的 keyframe 实现 loading 动画

    效果查看:https://jsfiddle.net/rubys/je16qL5k/6/ <!DOCTYPE html> <html lang="en"> & ...

  10. 使用OAuth2.0协议的github、QQ、weibo第三方登录接入总结

    目录 第三方接入总结 OAuth2.0介绍 github OAuth2.0登录接入 国内第三方应用商SDK使用 微博SDK 腾讯QQ SDK passport.js插件使用 安装 相关中间件.路由 返 ...