WPF中的网格表

时间:2011-02-12 14:59:39

标签: c# .net wpf wpf-controls

我需要创建一个网格。它应该是可编辑的
我应该设置行数和列数。
例如

mygrid.RowCount = 3;
mygrid.ColumnCount = 3;

以下是它的样子:

enter image description here

如何将2D数组绑定到DataGrid?

2 个答案:

答案 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 DataGrid

附注:WPF Grid类仅用于布局。它不提供数据编辑支持。

答案 1 :(得分:1)

以下是创建使用ItemsControl来布置其项目的Grid的一般技巧。在此示例(使用XML数据源)中,ItemsSource是具有RowColumnData属性的项的集合。

请注意ItemContainerStyle的使用。这是必要的,因为为了使Grid控件使用Grid.RowGrid.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>