C# WPF中DataGrid的数据绑定(Binding)

7550人阅读 评论(1) 收藏 举报
分类:

转载地址:http://www.zhixing123.cn/net/csharp-wpf-datagrid-binding.html

最近使用C#+WPF开发一个小测试工具,其中用到了DataGrid。因为没有C#+WPF的开发经验也是一边摸索一边开发,所幸C#+WPF的上手难度不大,开发过程较为顺利。不过在使用DataGrid的时候还是遇到了一点阻绊,并且让人有些恼火。

闲话少叙,讲一下这里DataGrid应该怎么用,以及要注意的事情。

DataGrid是个非常实用的控件,可以用来展示及获取较为复杂的数据结构。

要在C#+WPF下使用DataGrid并绑定数据,大致操作如下:


1. 在资源视图xml文件中添加DataGrid,并设置绑定。

<DataGrid x:Name="DATA_GRID" ItemsSource="{Binding}" AutoGenerateColumns="False" Grid.Row="1">
<DataGrid.Columns>
<DataGridTextColumn Header="姓名" Binding="{Binding name}"/>
<DataGridTextColumn Header="年龄" Binding="{Binding age}"/>
<DataGridComboBoxColumn Header="性别" SelectedItemBinding="{Binding sexual}" ItemsSource="{Binding Source={StaticResource SexualEnum}}"/>
</DataGrid.Columns>
</DataGrid>

如果要让DataGridComboBoxColumn中下拉列表的内容为制定枚举类型的内容,则要指定静态资源。这样,整个xaml文件如下:

<Window x:Class="DataGridTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:DataGridTest"
Title="C# WPF DataGrid" Height="350" Width="525" Loaded="MainWindowLoaded">
<Window.Resources>
<ObjectDataProvider x:Key="SexualEnum" MethodName="GetValues" ObjectType="{x:Type core:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:sexual_enum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="36*"/>
<RowDefinition Height="283*"/>
</Grid.RowDefinitions>
<Label Content="DataGrid" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
<DataGrid x:Name="DATA_GRID" ItemsSource="{Binding}" AutoGenerateColumns="False" Grid.Row="1">
<DataGrid.Columns>
<DataGridTextColumn Header="姓名" Binding="{Binding name}"/>
<DataGridTextColumn Header="年龄" Binding="{Binding age}"/>
<DataGridComboBoxColumn Header="性别" SelectedItemBinding="{Binding sexual}" ItemsSource="{Binding Source={StaticResource SexualEnum}}"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="BTN_CHK_DATA" Content="CheckData" HorizontalAlignment="Left" Margin="432,10,0,0" VerticalAlignment="Top" Width="75" Click="BTN_CHK_DATA_Click"/>

</Grid>
</Window>


2.在初始化代码中设置DataGrid绑定到的对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Collections.ObjectModel;

namespace DataGridTest
{
public enum sexual_enum {
BOY,
GIRL
}
public class people
{
public string name;//{ get; set; }
public string age { get; set; }
public sexual_enum sexual { get; set; }
}
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<people> peopleList = new ObservableCollection<people>();
public MainWindow()
{
InitializeComponent();

}

private void MainWindowLoaded(object sender, RoutedEventArgs e)
{
peopleList.Add(new people(){
name="小明",
age="18",
sexual = sexual_enum.BOY,
});
peopleList.Add(new people()
{
name = "小红",
age = "18",
sexual=sexual_enum.GIRL
});

((this.FindName("DATA_GRID")) as DataGrid).ItemsSource = peopleList;
}

private void BTN_CHK_DATA_Click(object sender, RoutedEventArgs e)
{
string txt = "";
foreach (people peo in peopleList)
{
txt += peo.name;
txt += peo.age;
txt += peo.sexual.ToString();
txt += "\r\n";

}

MessageBox.Show(txt);
}
}
}


3. 运行效果如下。

其中,弹出框中为peopleList的数据。

修改dataGrid中的数据,然后再点checkData按钮,可以看到数据已经被修改。

非常需要注意的一点是,在定义people的类时,成员变量一定要有get和set,如果没写,会出现找不到绑定项的错误,如下:

比如,如果去掉people类中name的get和set,那么会报如下错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'name' property not found on 'object' ''people' (HashCode=43794757)'. BindingExpression:Path=name; DataItem='people' (HashCode=43794757); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

这个很血泪……切记……

 

查看评论

WPF中DataGrid数据绑定(泛型和datatable)

前台代码: ...
  • kwy15732621629
  • kwy15732621629
  • 2016-07-16 19:53:11
  • 4754

WPF中DataGrid使用自定义列绑定数据

WPF中DataGrid使用自定义列绑定数据
  • hit_why
  • hit_why
  • 2017-03-24 14:24:35
  • 3701

WPF DataGrid中列的属性绑定问题

WPF中的DataGrid中Column的IsReadOnly和VIsibility等属性绑定时,总没有任何效果,输出里也显示找不到,搜了半天才发现,原来Column不属于visual 或 logic...
  • paltan
  • paltan
  • 2017-09-02 15:50:44
  • 440

WPF DataGrid 绑定数据及时更新的处理

默认情况下datagrid 绑定数据源后,在界面编辑某一列后,数据不会及时更新到内存对象中。如在同一行上有一个命令对来获取 当前选中行(内存对象)发现,数据未更新过来。解决办法:在列的绑定属性里加上U...
  • greystar
  • greystar
  • 2015-11-19 13:28:46
  • 12203

WPF下给DataGrid自动增加序列号

C#下使用WPF框架编程时,有时需要给DataGrid添加序号,实现方式一般两种,一种方式是通过LoadingRow,自动在列前边增加一列序号,该列为自动添加,没有列名字。另一种是自定义一列显示序号。...
  • mpegfour
  • mpegfour
  • 2017-12-23 22:44:04
  • 255

WPF学习笔记——编辑DataGrid单元格并实时更新到数据库

/NA_OnlyOne/article/details/52717389
  • gooapple
  • gooapple
  • 2017-12-01 19:47:09
  • 265

WPF Binding 最简单的用法绑定后台数据!!!

后台: public class cnm     {         public static string name;         public string Name { g...
  • qq_37246121
  • qq_37246121
  • 2018-01-31 12:46:16
  • 136

c#--wpf数据绑定binding

xaml    
  • dongmelon
  • dongmelon
  • 2017-08-09 15:23:54
  • 117

wpf DataGrid主从表,DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017

wpf DataGrid主从表, DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017 . 子表...
  • techcai
  • techcai
  • 2017-12-24 21:13:54
  • 120

WPF数据绑定机制是如何实现

接触MVVM模式也有一段时间了,这种将前后台分离开了的设计模式一下子就吸引了我,也是当时一直有一个问题困扰了我很久:WPF是如何实现数据变动通知的。 通过查询各种资料,自己反复推敲实验,终于发现这种...
  • liebert
  • liebert
  • 2017-09-19 23:01:39
  • 678
    个人资料
    等级:
    访问量: 7万+
    积分: 1038
    排名: 4万+
    最新评论