在WPF中,平时我们使用绑定,是将一个对象数组当作数据源,而对象又有很多属性,间接的相当于二维数组, 但这样做我们事先要知道对象有什么属性,有几个属性才能绑定 ,万一不确定ListView的列有多少行,需要在运行时才能确定呢?举例如下:
第一张图:
这里写图片描述
第二张图:
这里写图片描述
这两张图的数据的列数不一样,还有可能有其他列数不一样的文件数据,现在的需求是:要求我们的WPF ListView能够载入文件,然后显示出来。
因为有不确定性,所以无法事先定义Model来绑定到ListView上去。如果是Winform的Listview可以一列一列的赋值,但是WPF怎么实现呢?请看:
首先我们要获取列名:用一个string的数组表示好了,用一个二维string数组表示数据:

string[] headers = new string[] { "姓名", "年龄", "身高" };
string[][] datas = new string[][]
     new string[] { "111","1","165"},
     new string[] { "222","2","165"}

要注意headers 的长度与datas的第二个维度的长度要一样。
本示例前台代码:

<Window x:Class="二维数组绑定ListView.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:二维数组绑定ListView"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <ListView Name="lv"></ListView>
    </Grid>
</Window>

动态创建ListView的列(根据headers的长度):

 private void GenerateColumns(ListView listView, string[] headers)
            if (headers == null || headers.Length == 0)
                return;
            GridView gridView = new GridView();
            listView.View = gridView;
            for (int i = 0; i < headers.Length; i++)
                GridViewColumn column = new GridViewColumn();
                column.Header = headers[i];//设置列名称
                //此处设置数组的绑定,数组取第0个元素为list[0],通过索引器取
                column.DisplayMemberBinding = new Binding(string.Format("[{0}]", i));
                gridView.Columns.Add(column);

其中最重要的一句是:column.DisplayMemberBinding = new Binding(string.Format(“[{0}]”, i));动态绑定字符串数组里的元素
全部前台代码贴出来如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
namespace 二维数组绑定ListView
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
        private void Window_Loaded(object sender, RoutedEventArgs e)
            string[] headers = new string[] { "姓名", "年龄", "身高" };
            string[][] datas = new string[][]
                new string[] { "111","1","165"},
                new string[] { "222","2","165"}
            //根据Header长度生产列
            GenerateColumns(lv, headers);
            //设置数据源
            lv.ItemsSource = datas;
        private void GenerateColumns(ListView listView, string[] headers)
            if (headers == null || headers.Length == 0)
                return;
            GridView gridView = new GridView();
            listView.View = gridView;
            for (int i = 0; i < headers.Length; i++)
                GridViewColumn column = new GridViewColumn();
                column.Header = headers[i];//设置列名称
                //此处设置数组的绑定,数组取第0个元素为list[0],通过索引器取
                column.DisplayMemberBinding = new Binding(string.Format("[{0}]", i));
                gridView.Columns.Add(column);

运行结果:
这里写图片描述
增加header的列:

 private void Window_Loaded(object sender, RoutedEventArgs e)
            //string[] headers = new string[] { "姓名", "年龄", "身高" };
            //string[][] datas = new string[][]
            //    new string[] { "111","1","165"},
            //    new string[] { "222","2","165"}
            string[] headers = new string[] { "姓名", "年龄", "身高","体重","学历","户籍" };
            string[][] datas = new string[][]
                new string[] { "111","1","165","45KG","本科","湖北"},
                new string[] { "222","2","165","45KG","大专","湖南"}
            //根据Header长度生产列
            GenerateColumns(lv, headers);
            //设置数据源
            lv.ItemsSource = datas;

运行结果如下:
这里写图片描述
这样就解决了列不确定时,需要用ListView动态显示和绑定数据的问题

虽然wpf 开发有段时间了,但是对于绑定数据这块儿,理解的还是不太深入 。 参考了 http://blog.csdn.net/leftfist/article/details/25333425 的列子,也弄了个简单点的绑定对象列表的试了下。 public class Demo_2 { public static void main(String[] args) { // int[] arr = new int[3]; int[][] arr = new int[3][2];//创建一个二维数组,该数组中有三个一维数组,每一个一维数组中有两个元素。 xaml: &amp;lt;ListView Grid.Row=&quot;0&quot; Grid.Column=&quot;2&quot; Grid.RowSpan=&quot;3&quot; x:Name=&quot;listBoxIds&quot; SelectionMode=&quot;Single&quot;&amp;gt; &amp;lt;Li 1.为ListView直接添加整行: myListView.Columns.Add("", 50, HorizontalAlignment.Left); myListView.Columns.Add("", 50, HorizontalAlignment.Left); myListView.Columns.Add("", 50, HorizontalAlignment.Left); myListView.Items.Add(new ListViewItem(new string[] { "张三", "1 int[,] TABLE = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; DataTable dt = new DataTable(); for (int i = 0; i < TABLE.GetLength(1); i++) dt.Columns.Add(i.ToString(), typeof(int)); for (int i = 0; i < TA 最近有一个需求,需要根据用户数据动态生成二维数据表,绑定到表格后,用户再次编辑数据,最后再将编辑过的数据,生成类型数据,存入数据库。 仔细分析过后,觉得最适合的方式,莫过于给DataGrid绑定DynamicObj 以下是项目效果 二维表格第一行和第一列第二列均于用户以excel的方式传入 然后再进行编辑和选择。然后再将每行数据转为数据库格式。例如某一行数据如下: 提取码:1f48 // 组图的加载与导入 Dictionary<int, string> dic = new Dictionary<int, string>(); // 保存 序号--文件路径 private void LoadImgList() this.listView1.Items.Add(new ListViewItem(new string[] { "Jack", "Jack", "Jack", "Test4", "Test5", "Test6" })); 使用匿名类很方便,如果是添加多行数据,放循环也很方便,个人感觉没必要实例化ListViewItem。 PS:最近在整理浏览器收藏夹中以前收藏的一些文章,把自己以前用到的或者感觉以后会用到的都转帖一下,勿拍砖。 本文通过五个步骤详细介绍C# WinForm 实现文件的拖入和拖出(拖拽操作),每个步骤都提供相关的示例代码供参考。 步骤1、放置一个 ListViewWinform窗体中 并初始化如下属性: