Estoy trabajando con DataGrids pero estoy luchando a la unión de mis datos, ya que el número de columnas varía en función de la información que ha de ser mostrado.

Así que lo que he tratado de hacer es crear y el objeto que contiene todas las columnas y filas que necesito en algún punto de unión de este objeto a la ItemsSource de la propiedad. Ya he trabajado con DataGridViews en WindowsForms tengo en mente algo como esto:

DataTable myTable = new DataTable();

DataColumn col01 = new DataColumn("col 01");
myTable.Columns.Add(col01);
DataColumn col02 = new DataColumn("col 02");
myTable.Columns.Add(col02);

DataRow row = myTable.NewRow();
row[0] = "data01";
row[1] = "data02";
myTable.Rows.Add(row);

row = myTable.NewRow();
row[0] = "data01";
row[1] = "data02";
myTable.Rows.Add(row);

Pero no he sido capaz de encontrar una manera de hacer la misma cosa en WPF ya que necesito un poco de columnas que se DataGridComboBoxColumns por ejemplo.

De hecho he leído muchos post sobre esto en este sitio, pero ninguno de ellos ayudaron a mí. Estoy realmente perdido.

Podría alguien ayudarme? Sólo tengo que ser capaz de crear una tabla que puede contener DataGridTextColumns o `DataGridComboBoxColumns, etc, con el fin De enlazar este objeto final para el control DataGrid de la propiedad ItemsSource.

Espero que alguien me pueda ayudar.

InformationsquelleAutor Dante | 2012-05-25

3 Comentarios

  1. 5

    Bien, permítanme tomar un ejemplo, que es similar a sus necesidades

    Vamos a asumir que el uso de esta clase:

    public class MyObject
    {
       public int MyID;
       public string MyString;
       public ICommand MyCommand;
    }

    Y estamos dispuestos a mostrar una DataGrid listado de la ID, y teniendo como una segunda columna de un Button, con la propiedad MyString como de contenido, que, cuando se pulsa, se inicia el ICommand MyCommand que se abre en una nueva ventana lo que quieras.

    Aquí es lo que usted debe tener en la Vista lateral:

        <DataGrid ItemsSource="{Binding MyList}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding MyID}" />
                <DataGridTemplateColumn Header="Buttons">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="{Binding MyString}" Command="{Binding MyCommand}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

    Esto mostrará una DataGrid tomar todo el contenido en un IEnumerable<MyObject> nombrado «Milista», y muestra dos columnas como se definió antes.

    Ahora bien, si usted necesita para definir el comando.
    En primer lugar, le recomiendo que lea la esta introducción enlace a MVVM y tomar el RelayCommand de la clase (que es lo que vamos a utilizar para su problema)

    Así, en su ViewModel, la que define la MyList, aquí es cómo usted debe definir algunos de los objetos útiles:

    public ObservableCollection<MyObject> MyList { get; set; }
    
    //blah blah blah
    
    public void InitializeMyList()
    {
      MyList = new ObservableCollection<MyObject>();
      for (int i = 0; i < 5; i++)
      {
        MyList.Add(InitializeMyObject(i));
      }
    }
    
    public MyObject InitializeMyObject(int i)
    {
      MyObject theObject = new MyObject();
      theObject.MyID = i;
      theObject.MyString = "The object " + i;
      theObject.MyCommand = new RelayCommand(param =< this.ShowWindow(i));
      return theObject
    }
    
    private void ShowWindow(int i)
    {
      //Just as an exammple, here I just show a MessageBox
      MessageBox.Show("You clicked on object " + i + "!!!");
    }
    • Gracias por tu respuesta, lo he probado y funciona, pero mi problema es que necesito que sea dinámico, por lo tanto, quiero ser capaz de hacer lo que me dicen que hacer sin declarar las columnas en el archivo XAML, ¿hay alguna manera de hacerlo?
    • ¿Qué desea mostrar en sus columnas? Quiero decir, no depende de algunos parámetros? Usted fácilmente puede declarar de forma manual y dinámica de las columnas en el código, me dan más detalles acerca de lo que necesitas y yo te mostraré un buen fragmento de código que usted podría utilizar
    • Gracias. Bueno, resulta que mi dataGrid se muestra siempre diferentes conjuntos de datos. Esta conjuntos de datos pueden contener columnas de botones, combobox columnas de opción, casilla de verificación columnas o columna de texto. Por lo tanto, mi idea es poner la propiedad AutogenerateColumns a la verdadera y pasa un objeto que contiene las columnas de la estructura y los datos que tiene que aparecer en algún momento. Por esta razón no puedo definir manualmente las columnas en el XAML. Gracias de antemano @Damasco
  2. 2

    Un ejemplo sencillo de la unión a una ObservableCollection de un objeto personalizado. Agregar más propiedades para el objeto personalizado para que coincida con lo que usted quiere que sus filas a parecer.

     using System.Collections.ObjectModel;
    
     public MyClass
     {
          public ObservableCollection<MyObject> myList { get; set; }
    
          public MyClass()
          {
               this.DataContext = this;
               myList = new ObservableCollection<MyObject>();
               myList.Add(new MyObject() { MyProperty = "foo", MyBool = false };
               myList.Add(new MyObject() { MyProperty = "bar", MyBool = true };
          }
     }
    
     public MyObject
     {
          public string MyProperty { get; set; }
          //I believe will result in checkbox in the grid
          public bool MyBool { get; set; }
          //...as many properties as you want
     }

    con xaml

      <DataGrid ItemsSource= "{Binding myList}" />

    Podrían ser algunos de los pequeños errores de sintaxis, escribí que completamente dentro de la ventana.

    • Gracias por tu respuesta, pero yo estaba tratando de evitar el uso de tablas de datos ya que según lo que yo sé, la DataColumn no permite añadir algo diferente que el texto como un control, como un combobox, un botón, una casilla de verificación, haga?
    • En ese caso se debe hacer una ObservableCollection de objetos personalizados que hacen que representarán a cada fila, voy a editar para una implementación básica.
    • Esto funciona, pero Si me gustaría agregar un botón o un cuadro combinado, qué tipo debo declarar mis propiedades?
    • Usted puede poner en un elemento selector de plantilla para comprobar el tipo de propiedad (o algo más que usted puede configurar) y configurarlo para que el botón o combobox o navegador web, o lo que quieras, yo no tengo un tipo de código de un ejemplo, pero google celltemplateselector para wpf datagrid
  3. 0

    Soy nuevo en WPF y se utiliza Damasco el ejemplo de aprender de unión de una Lista a un control datagrid. Pero cuando he usado su respuesta me encontré con que mi datagrid rellena con el número correcto de las filas, pero no con cualquiera de las propiedades de la clase MyObject. Hice un poco más de búsqueda, a continuación, se tropezó con lo que tenía que hacer por accidente.

    Tuve que encapsulan la MyObject propiedades de la clase de que se muestren. Esto no fue suficiente para hacer que se de público.

    Antes:

    public class MyObject
    {
       public int MyID;
       public string MyString;
       public ICommand MyCommand;
    }

    Después:

    public class MyObject
    {
        private int _myID;
    
        public int MyID
        {
            get { return _myID; }
            set { _myID = value; }
        }
        private string _myString;
    
        public string MyString
        {
            get { return _myString; }
            set { _myString = value; }
        }
        private ICommand _myCommand;
    
        public ICommand MyCommand
        {
            get { return _myCommand; }
            set { _myCommand = value; }
        }
    }

    Gracias a Damasco para un gran ejemplo y gracias Dante por una gran pregunta. No sé si esto es debido a un cambio en la versión desde su puesto, pero esperemos que esto ayude a otros nuevos para WPF como yo.

Dejar respuesta

Please enter your comment!
Please enter your name here