2011-02-13 12 views
38

Soy nuevo en WPF y quiero hacer algunos enlaces de datos básicos. Tengo una Lista de un CustomObject y quiero vincularlo a un DataGrid.¿Cómo puedo vincular una Lista <CustomObject> a un WPF DataGrid?

MainWindow.xaml.cs

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 WpfApplication1 
    { 
     /// <summary> 
     /// Interaction logic for MainWindow.xaml 
     /// </summary> 
     public partial class MainWindow : Window 
     { 
      public MainWindow() 
      { 
       InitializeComponent(); 
       List<ArticleItem> list = new List<ArticleItem>() 
       { 
       new ArticleItem(){ ID=3, Title="test", ViewCount=5}, 
       new ArticleItem(){ ID=3, Title="test", ViewCount=5}, 
       new ArticleItem(){ ID=3, Title="test", ViewCount=5}, 
       new ArticleItem(){ ID=3, Title="test", ViewCount=5}, 
       }; 
      } 
     } 

     public class ArticleItem 
     { 
      public int ID { get; set; } 
      public int ViewCount { get; set; } 
      public String Title { get; set; } 
     } 
    } 

Este es el aspecto de mi rejilla como:

<DataGrid Height="179" HorizontalAlignment="Left" Margin="54,65,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="382"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID"/> 
      <DataGridTextColumn Header="ViewCount" /> 
     <DataGridTextColumn Header="Title" /> 
    </DataGrid.Columns> 
</DataGrid> 

Estoy acostumbrado al enlace de datos de ASP.Net, donde puedo decir fácilmente:

this.dataGrid1.DataSource = list; 

¿Cómo debo proceder en WPF?

Respuesta

25

si usted no espera que su list se recreará a continuación, puede utilizar el mismo enfoque que se ha utilizado para Asp.Net (en lugar de DataSource esta propiedad en WPF es usualmente llamado ItemsSource):

this.dataGrid1.ItemsSource = list; 

Pero si desea reemplazar su list con una nueva instancia de recopilación, entonces debería considerar usar databinding.

+0

Tengo varias filas en una cuadrícula de datos en la que cada fila de la cuadrícula de datos tiene un botón que abre una ventana emergente en su clic y en la ventana emergente tengo otra cuadrícula de datos con el botón. Ahora al hacer clic en este botón quiero tomar los datos de fila respectivos de el cual se hace clic en el botón y agrega esta fila de datos a la primera fila DataGrid desde la cual se abre la ventana emergente. –

17

Debe hacerlo en el código XAML:

<DataGrid ItemsSource="{Binding list}" [...]> 
    [...] 
</DataGrid> 

Yo aconsejaría que use un ObservableCollection como su colección de respaldo, ya que ello propagar los cambios a la cuadrícula de datos, ya que implementa INotifyCollectionChanged.

+0

Yo no lo entiendo. Me moví para enumerar una variable de instancia y utilicé estos atributos xaml para DataGrid: ItemsSource = "{lista de enlaces}" AutoGenerateColumns = "true". A excepción, veo un DataGrid vacío sin filas y sin columnas – citronas

+1

, necesita ser una propiedad para el enlace de datos. Además, eche un vistazo a la ventana de resultados, generalmente hay información que lo ayudará a resolver el problema. – Femaref

+1

@citronas: Además de hacer que la Lista sea una propiedad, el 'DataGrid' también necesitará un DataContext para que funcione el Enlace. Establece 'esto.DataContext = this; 'en el constructor para' MainWindow' y debería funcionar en –

8

En realidad, para apoyar adecuadamente clasificación, filtrado, etc. un CollectionViewSource debe ser utilizado como un enlace entre la cuadrícula de datos y la lista, así:

<Window.Resources> 
    <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/> 
</Window.Resources> 

La línea de cuadrícula de datos es el siguiente:

<DataGrid 
    DataContext="{StaticResource ItemCollectionViewSource}" 
    ItemsSource="{Binding}" 
    AutoGenerateColumns="False"> 

En el código subyacente, vincula CollectionViewSource con su enlace.

CollectionViewSource itemCollectionViewSource; 
itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource")); 
itemCollectionViewSource.Source = itemList; 

Por ejemplo detallado ver mi artículo sobre CoedProject: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings

+0

Me encanta este enfoque: ¿ha mejorado esto de forma reutilizable en los últimos dos años? – TaterJuice

+1

No estoy seguro de lo que quiere decir con "una forma reutilizable". Por cierto, Visual Studio genera un código similar cuando coloca una tabla desde la ventana "Orígenes de datos" en la ventana de WPF. –

3

Usted no necesita dar nombres de columna manualmente en XAML. Simplemente configure la propiedad AutoGenerateColumns como verdadera y su lista se vinculará automáticamente a DataGrid. referir el código. Código XAML:

<Grid> 
    <DataGrid x:Name="MyDatagrid" AutoGenerateColumns="True" Height="447" HorizontalAlignment="Left" Margin="20,85,0,0" VerticalAlignment="Top" Width="799" ItemsSource="{Binding Path=ListTest, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" CanUserAddRows="False"> </Grid> 

C#

Public Class Test 
{ 
    public string m_field1_Test{get;set;} 
    public string m_field2_Test { get; set; } 
    public Test() 
    { 
     m_field1_Test = "field1"; 
     m_field2_Test = "field2"; 
    } 
    public MainWindow() 
    { 

     listTest = new List<Test>(); 

     for (int i = 0; i < 10; i++) 
     { 
      obj = new Test(); 
      listTest.Add(obj); 

     } 

     this.MyDatagrid.ItemsSource = ListTest; 

     InitializeComponent(); 

    } 
+0

¡Me encanta! ¡Muy limpio! – TaterJuice

+0

gracias ... @ Turk – Neha

+1

Gracias. Originalmente no tenía el 'get' y' set', lo que significaba que no se generaba nada y estaba confundido. –

Cuestiones relacionadas