一、前台实现

在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. P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  2. 聊聊flink的AsyncWaitOperator

    序本文主要研究一下flink的AsyncWaitOperator AsyncWaitOperatorflink-streaming-java_2.11-1.7.0-sources.jar!/org/a ...

  3. Linux学习笔记一:Linux配置java环境变量

    一.安装JDK: 1.创建JDK的安装目录: sudo mkdir /usr/jdk 2.将jdk-7u25-linux-x64.tar.gz拷贝至/usr/jdk目录下 sudo cp jdk-7u ...

  4. hdu5279 YJC plays Minecraft 【分治NTT】

    题目链接 hdu5279 题解 给出若干个完全图,然后完全图之间首尾相连并成环,要求删边使得两点之间路径数不超过\(1\),求方案数 容易想到各个完全图是独立的,每个完全图要删成一个森林,其实就是询问 ...

  5. C内存对齐问题-bus error!总线错误!其实是 字符串字面量修改问题!

    最近写个小程序,出现bus error! int main(void) { /** * char :1个字节 * char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也 ...

  6. bzoj3884: 上帝与集合的正确用法(数论)

    感觉是今天洛谷月赛T3的弱化版,会写洛谷T3之后这题一眼就会写了... 还是欧拉扩展定理 于是就在指数上递归%phi(p)+phi(p)直到1,则后面的指数就都没用了,这时候返回,边回溯边快速幂.因为 ...

  7. luoguP5105 不强制在线的动态快速排序

    emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...

  8. 【recording】gdoi2018

    怎么说..虽然感觉其实..不太想写游记.. 但是回来看着桌面上的课本还是忍不住了(想想班里进度就..qwq)还是写一下吧 Day x(x<0) 之前大家溜到首都开心集训了一波然后被虐的很开心.. ...

  9. 使用Masonry在UIScrollView内布局

    理论分析 首先,我们知道Autolayout改变了传统的以frame为主的布局思想.它其实是一种相对布局,核心思想是视图与视图之间的位置关系.比如,我们可以根据矩形的起始横坐标.纵坐标.长和宽这四个变 ...

  10. dfs.datanode.du.reserved 预留空间不生效的问题

    生产环境(cdh5.5.1)遇到一个问题:已经设置 dfs.datanode.du.reserved预留空间为20G,但是磁盘仍然被写满了. 当挂载磁盘作为datanode的存储空间,如果磁盘大小为2 ...