none
WPF4 中DataGrid插入行的问题 RRS feed

  • 问题

  • 最近使用WPF,发现DataGrid好像只能接受绑定数据进行显示。

    我想手动往Row里面插入一行数据,发现DataGrid没有插入Row的功能(或许我没找到)。

    如何让DataGrid里面手动插入1行数据?(不通过绑定的方法)

    忘记在哪里看到说:DataGrid其实没有行的概念,是基于列的。

    有没有详细介绍WPF4自带DataGrid的设计原理或者实现原理的文章?给个地址我了解下。

    2012年6月22日 4:11

答案

  • 您好,手动插入一行数据可以用您可以在代码中使用DataGridItems属性Add()方法来添加一行。

    需要注意的是,如果您使用ItemSource来生成内容的话Items属性将是只读并且固定大小的。当

    ItemSource设为Null时,会移除集合并恢复使用Items 事实上我们推荐您通过绑定来使用DataGrid进行数据显示。数据绑定的好处很多可以让您程序逻辑与

    UI完全分离,能够实时的显示数据的改变并提供了排序和分类的功能等等。

    下面是一个使用DataGrid通过数据绑定的样例: XAML

    <Window x:Class="WpfApplication4.MainWindow"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            xmlns:local="clr-namespace:WpfApplication4"

            Title="MainWindow" Height="250" Width="255">

    <Window.Resources>

            <local:People x:Key="Family">

                <local:Person Name="Tom" Age="11" />

                <local:Person Name="John" Age="12" />

                <local:Person Name="Melissa" Age="38" />

            </local:People>

    </Window.Resources>

        <StackPanel>

            <DataGrid Name="datagrid1"  ItemsSource="{Binding Source={StaticResource

    Family}}" AutoGenerateColumns="False" IsReadOnly="True">

                <DataGrid.Columns>

                    <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />

                    <DataGridTextColumn Header="Age" Binding="{Binding Path=Age}" />

                </DataGrid.Columns>

            </DataGrid>

            <Button Click="addButton_Click" Margin="10">Add</Button>

        </StackPanel>

    </Window>

     

    c# Person class

     

    namespace WpfApplication4

    {

        public class Person     

        {       

            public string Name { get; set; }

           

            public int Age { get; set; }

          

            public Person() { }

            public Person(string name, int age)

            {

                this.Name = name;

                this.Age = age;

            }

        }

    }

     

    class People : ObservableCollection<Person> { }//使用ObservableCollection的原因是实

    现了INotifyCollectionChanged接口,可以知道集合的新增项和移除项并实时显示出来。

     

    MainWindow class:

    namespace WpfApplication4

    {

        /// <summary>

        /// Interaction logic for MainWindow.xaml

        /// </summary>

      

       

        public partial class MainWindow : Window

        {

         

            public MainWindow()

            {

                InitializeComponent();

               

            }

            void addButton_Click(object sender, RoutedEventArgs e)

            {

                People people = (People)this.FindResource("Family");

                people.Add(new Person("Chris", 37));

            }

        }

    }

     

    上面的例子使用了资源存储数据,并通过将DataGridItemSource绑定到资源上,之后对资源进行添

    加和移除就可以很方便的实时的显示出改动的结果。如果您想对资源在程序运行中进行改变之后实时

    的显示在窗口中,需要实现Person类的INotifyPropertyChanged接口。具体方法如下:

    Person class

    namespace WpfApplication4

    {

        public class Person : INotifyPropertyChanged

        {

            public event PropertyChangedEventHandler PropertyChanged;

            protected void Notify(string propName)

            {

                if (this.PropertyChanged != null)

                {

                    PropertyChanged(this, new PropertyChangedEventArgs(propName));

                }

            }

            string name;

            public string Name

            {

                get { return this.name; }

                set

                {

                    if (this.name == value)

                        return;

                    this.name = value;

                    Notify("Name");

                }

            }

            int age;

            public int Age

            {

                get { return this.age; }

                set

                {

                    if (this.age == value)

                        return;

                    this.age = value;

                    Notify("Age");

                }

            }

            public Person() { }

            public Person(string name, int age)

            {

                this.Name = name;

                this.Age = age;

            }

        }

        class People : ObservableCollection<Person> { }

    }

     

    关于DataGrid的具体使用方法可以参考下面文章: http://msdn.microsoft.com/zh-cn/library/ee340710.aspx

    DataGrid的具体功能的代码示例: http://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical-Examples

    希望对您有帮助。



    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us


    2012年6月25日 9:33
    版主