一、前台实现

在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. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  2. CF785D Anton and School - 2 解题报告

    CF785D Anton and School - 2 题意:给定一个长度\(\le 2 \times 10e5\)由'('和')'组成的字符串,问有多少个子串(可以不连续),前半部分是由\('('\ ...

  3. word----遇到问题-----word中插入的图片无法左对齐----格式按钮为灰色

    当我们在用word时,有时要插入图片,却发现,插入的图片只在中间位置,不能拖到左边,这时怎么办呢 主要是图层的高低原因导致的不能拖动. 这个时候我们只需要设置一下图片的图层类型即可. 对着图片右键在设 ...

  4. 【2016北京集训】Mushroom

    Portal --> broken qwq Description 一开始有个蘑菇,蘑菇里面有\(n\)个房间,是一棵有根树,\(1\)号是根,每个房间里面都有杂草,现在要支持以下操作:将某个指 ...

  5. BMP格式图像读取与存储

    全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...

  6. 玲珑学院oj 1152 概率dp

    1152 - Expected value of the expression Time Limit:2s Memory Limit:128MByte Submissions:128Solved:63 ...

  7. hiho 1044 : 状态压缩

    #1044 : 状态压缩·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车 ...

  8. 04-树5. File Transfer--并查集

    对于一个集合常见的操作有:判断一个元素是否属于一个集合:合并两个集合等等.而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具. 并查集是利用树结构实现的.一个集合用一 ...

  9. array_diff、array_diff_key、array_diff_ukey、array_diff_assoc、array_diff_uassoc 的用法

    <?php // array_diff* 系列的函数都返回关联数组// array_diff* 系列函数返回数组的差集(返回在第一个参数中, 但不在其他参数中的元素) $array1 = [ ' ...

  10. @Springboot搭建项目controller层接收json格式的对象失败

    今天在使用swagger2测试的时候出错 1.@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说: ...