我需要创建一个网格。它应该是可编辑的
我应该设置行数和列数。
例如
mygrid.RowCount = 3;
mygrid.ColumnCount = 3;
以下是它的样子:
如何将2D数组绑定到DataGrid?
答案 0 :(得分:16)
您可以使用WPF DataGrid控件。它显示一个单元格网格,对应于包含属性(列)的对象(行)集合。您需要提供数据存储 - 对象的集合。集合中的对象数(集合计数)将确定网格中的行数。 DataGrid支持在UI中编辑数据。
此示例定义了三列,并将它们绑定到数据对象的A,B和C属性。
<DataGrid AutoGenerateColumns="False"
Height="200"
HorizontalAlignment="Left"
Name="dataGrid1"
VerticalAlignment="Top"
Width="200">
<DataGrid.Columns >
<DataGridTextColumn Binding="{Binding Path=A}" MinWidth="50" />
<DataGridTextColumn Binding="{Binding Path=B}" MinWidth="50" />
<DataGridTextColumn Binding="{Binding Path=C}" MinWidth="50" />
</DataGrid.Columns>
</DataGrid>
您需要将具有这些属性的对象集合(在代码中或使用数据绑定)分配给DataGrid的ItemsSource属性,就像使用任何其他ItemsControl一样。像这样:
public partial class MainWindow: Window
{
public class DataObject
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
public MainWindow()
{
InitializeComponent();
var list = new ObservableCollection<DataObject>();
list.Add(new DataObject() { A = 6, B = 7, C = 5 });
list.Add(new DataObject() { A = 5, B = 8, C = 4 });
list.Add(new DataObject() { A = 4, B = 3, C = 0 });
this.dataGrid1.ItemsSource = list;
}
在编辑中心单元格时,结果如下所示:
附注:WPF Grid类仅用于布局。它不提供数据编辑支持。
答案 1 :(得分:1)
以下是创建使用ItemsControl
来布置其项目的Grid
的一般技巧。在此示例(使用XML数据源)中,ItemsSource
是具有Row
,Column
和Data
属性的项的集合。
请注意ItemContainerStyle
的使用。这是必要的,因为为了使Grid
控件使用Grid.Row
和Grid.Column
附加属性,必须将这些属性附加到插入到网格中的对象 - 如果您尝试设置它们位于TextBox
生成的ItemsTemplate
上,网格无法看到它们,因为它正在查看生成的ContentPresenter
,而不是其中的TextBox
。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<XmlDataProvider x:Key="Data">
<x:XData>
<Data xmlns="">
<Item Row="0" Column="0" Data="0,0"/>
<Item Row="1" Column="1" Data="1,1"/>
<Item Row="2" Column="1" Data="2,1"/>
<Item Row="3" Column="2" Data="3,2"/>
<Item Row="4" Column="4" Data="4,4"/>
<Item Row="4" Column="3" Data="4,3"/>
</Data>
</x:XData>
</XmlDataProvider>
</Page.Resources>
<DockPanel>
<ItemsControl ItemsSource="{Binding Source={StaticResource Data}, XPath=/Data/Item}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Grid.Row" Value="{Binding XPath=@Row}"/>
<Setter Property="Grid.Column" Value="{Binding XPath=@Column}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding XPath=@Data, Mode=TwoWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
</Page>