大家好!
我希望通过我的文章可以阐明将DataGrid的XML表示与其代码集合链接在一起的问题。 为此,最好使用一个特定的示例。
因此,我们需要将某些结构的元素列表放在表中。 假设元素本身在代码中的外观如下:
class Element { public Element (string firstName, string lastName, string phoneNumber, DateTime date) { this.firstName = firstName; this.lastName = lastName; this.phoneNumber = phoneNumber; this.date = date; } public string FirstName { get { return this.firstName; } set { this.firstName = value; } } public string LastName { get { return this.lastName; } set { this.lastName = value; } } public string PhoneNumber { get { return this.phoneNumber; } set { this.phoneNumber = value; } } public DateTime Date { get { return this.date; } set { this.date = value; } } private string firstName; private string lastName; private string phoneNumber; private DateTime date; }
因此,他们的清单将如下所示:
List<Element> elements = new List<Element>();
现在,让我们继续到DataGrid。 由于这都是相同的WPF,因此您可以用手将其拉到表单上。 让IDE为其编写代码。
<DataGrid x:Name="dataGrid" Margin="10,103,0,15" CellEditEnding="dataGrid_CellEditEnding" Grid.RowSpan="2" Grid.ColumnSpan="2" HorizontalAlignment="Left" Width="728" AutoGenerateColumns="False"/>
在这里,我仅手动设置AutoGenerateColumns =“ False”,因为将来我们将自己编辑表列。
接下来,我们需要将数据绑定到表,元素的每个字段必须对应于表的列。
<DataGrid.Columns> <DataGridTextColumn Header="" Binding="{Binding Path=FirstName}"/> <DataGridTextColumn Header="" Binding="{Binding Path=LastName}"/> <DataGridTemplateColumn Header="" SortMemberPath="PhoneNumber"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Path=PhoneNumber}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Text="{Binding Path=PhoneNumber}" /> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="" SortMemberPath="Date"> <DataGridTemplateColumn.CellTemplate> <DataTemplate > <TextBlock Text="{Binding Path=Date, StringFormat='dd/MM/yyyy'}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <DatePicker SelectedDate="{Binding Date}"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> </DataGrid.Columns>
此处使用两种类型的列DataGridTextColumn和DataGridTemplateColumn。 您可以在任何地方阅读有关它们的类型的信息。 在这里主要要了解的是,借助DataGridTemplateColumn,您可以设置任何模板。 也就是说,可以在此列的单元格中放置任何控件(按钮,日历等)。 例如,在第三列中是一个TextBox:
<DataGridTemplateColumn Header="" SortMemberPath="PhoneNumber"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Path=PhoneNumber}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate>
重要说明:不要忘记注册Header,因为我们禁用了自动完成功能。 而且对于DataGridTemplateColumn,有必要注册SortMemberPath,以便他知道按哪个字段对数据进行排序。让我们继续进行绑定。 这是数据绑定本身。 我们使用绑定路径= PhoneNumber来指定它。 这里要考虑的主要事情是这是返回字段值的类方法的名称(不是phoneNumber,而是PhoneNumber,请参见类说明)。
还有一件事。 可以为处于正常状态(CellTemplate)和处于编辑状态(CellEditingTemplate)的单元格输入不同类型的模板(DataTemplate)。 在正常状态下单元格的第四列是一个TextBox,在编辑状态下是DatePicker:
<DataGridTemplateColumn Header="" SortMemberPath="Date"> <DataGridTemplateColumn.CellTemplate> <DataTemplate > <TextBlock Text="{Binding Path=Date, StringFormat='dd/MM/yyyy'}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <DatePicker SelectedDate="{Binding Date}"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn>
还值得注意的是,在使用日期时,“文本”字段具有可格式化的StringFormat属性。 对于月份的正确显示,重要的是“ MM”应该很大。
现在,要将特定数据绑定到表,让我们回到C#中的代码。
用元素填充数组后,必须将其指定为数据源:
dataGrid.ItemsSource = elements;
因此,对元素的任何更改都将显示在表中,相反,对表所做的任何更改都将导致元素的更改。 但是在更改元素时,必须调用该方法
dataGrid.Items.Refresh();
。
作为C#捆绑软件的另一个很好的示例-XML,我将举一个检查仅用数字填充电话号码单元格的示例。 为此,请稍微编辑第三列中的代码:
<DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Path=PhoneNumber}" TextChanged="phN_TextChanged"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate>
可以看出,在TextBox标记中,我为文本更改事件分配了一个处理程序。 现在只需要在代码中注册此处理程序即可:
private void phN_TextChanged(object sender, TextChangedEventArgs e) { int result = 0; TextBox txtx = sender as TextBox; if (txtx !=null) { if (!int.TryParse(txtx.Text, out result)) { txtx.Text = txtx.Text.Substring(0, txtx.Text.Length - 1); txtx.CaretIndex = txtx.Text.Length; } } }
也可以通过正则表达式检查数字。
向所有人发布!