一、前台实现

在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. 【codeforces914G】Sum the Fibonacci FWT+FST(快速子集变换)

    题目描述 给出一个长度为 $n$ 的序列 $\{s\}$ ,对于所有满足以下条件的五元组 $(a,b,c,d,e)$ : $1\le a,b,c,d,e\le n$ : $(s_a|s_b)\& ...

  2. [JSOI2009]电子字典 hash

    题面:洛谷 题解: 做法....非常暴力. 因为要求的编辑距离最多只有1,所以我们直接枚举对那个位置(字符)进行操作,进行什么样的操作,加入/修改/删除哪个字符,然后暴力枚举hash判断即可, #in ...

  3. 【BZOJ2436】【NOI2011】NOI嘉年华(动态规划)

    [BZOJ2436]NOI嘉年华(动态规划) 题面 BZOJ 题解 考虑第一问如何求解 发现状态与选择了哪些活动无关,只与时间有关 设\(f[i][j]\)表示前\(i\)个单位时间(离散后),一个嘉 ...

  4. ZJOI2018 D1

    归途的车上满是悲伤的气息 虽然早就预言到D1会滚粗,但一切都结束之后还是特别难过. 延时15min 50min T1 30pts 1.5h T2 10pts 2.5h T1 50pts 4.5h T3 ...

  5. POJ.3279 Fliptile (搜索+二进制枚举+开关问题)

    POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...

  6. Codeforces Round #415 (Div. 2) A B C 暴力 sort 规律

    A. Straight «A» time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. C++实现人员信息管理系统模拟

    利用C++语言实现基本的学生信息管理系统: 要求: 1-设置管理员密码 2-人员数据有:姓名,性别等基本的信息 3-可以添加,删除,保存,统计 #include<iostream> #in ...

  8. Centos7单机部署ELK

    一. 简介 1.1 介绍 ELK是三个开源工具组成,简单解释如下: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风 ...

  9. phpstrom+xdebug+chrome+postman调试工具搭建

    php是解释性语言,大部分调试的时候使用var_dump+exit就可以搞定了,但是在大项目或遇到了负载的问题的时候你就需要断点调试.变量打印.性能分析了,php也有非常程序的解决方案,我们现在就动手 ...

  10. Vue.js随笔二(新建路由+component+添加样式+变量的显示)

    创建一个页面: 1.首先让我们看一下整个vue.js的目录,如下图所示: 2.现在让我们创建一个页面吧: 2-1首先你需要新建路由(就和建立一个如何找到项目文件的目录一个意思):进入src/route ...