2013-05-29 17 views
8

Ho un datagrid tipo matrix come questo.Come associare un array 2D bool [] [] a un WPF DataGrid (a una via)?

enter image description here

questa griglia è progettata interamente in XAML

Ora come inserire i valori in questi datagridcell con 2 array bidimensionale? i valori che devono essere inseriti devono essere del tipo di dati bool (TRUE o FALSE). Qualche idea?

+0

http://stackoverflow.com/questions/276808/how-to-populate-a-wpf-grid -based-on-a-2-dimensional-array –

risposta

15

Ecco il mio approccio per uno scenario MVVM, utilizzando un convertitore che crea un DataView che può essere associato alle griglie ItemsSource. E 'per uno speciale tipo di dati Matrix che detiene doppie, ma sarete in grado di modificare da soli per le vostre esigenze:

public class MatrixToDataViewConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var array = value as Matrix; 
     if (array == null) return null; 

     //var array = ILMath.rand(3, 5); 

     var rows = array.Dimensions[0]; 
     var columns = array.Dimensions[1]; 

     var t = new DataTable(); 
     for (var c = 0; c < columns; c++) 
     { 
      t.Columns.Add(new DataColumn(c.ToString())); 
     } 

     for (var r = 0; r < rows; r++) 
     { 
      var newRow = t.NewRow(); 
      for (var c = 0; c < columns; c++) 
      { 
       var v = array[r, c]; 

       // Round if parameter is set 
       if (parameter != null) 
       { 
        int digits; 
        if (int.TryParse(parameter.ToString(), out digits)) 
         v = Math.Round(v, digits); 
       } 

       newRow[c] = v; 
      } 

      t.Rows.Add(newRow); 
     } 


     return t.DefaultView; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

definire una risorsa per il convertitore:

<converter:MatrixToDataViewConverter x:Key="MatrixToDataViewConverter" /> 

e utilizzarlo come questo :

<DataGrid ItemsSource="{Binding Matrix, Converter={StaticResource MatrixToDataViewConverter}, ConverterParameter=1}"/> 

non permette di legame a doppio senso, anche se ...

EDIT

Ecco la versione di un bool array [] []:

public class BoolArrayToDataViewConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var array = value as bool[,]; 
     if (array == null) return null; 

     var rows = array.GetLength(0); 
     if (rows == 0) return null; 

     var columns = array.GetLength(1); 
     if (columns == 0) return null; 

     var t = new DataTable(); 

     // Add columns with name "0", "1", "2", ... 
     for (var c = 0; c < columns; c++) 
     { 
      t.Columns.Add(new DataColumn(c.ToString())); 
     } 

     // Add data to DataTable 
     for (var r = 0; r < rows; r++) 
     { 
      var newRow = t.NewRow(); 
      for (var c = 0; c < columns; c++) 
      { 
       newRow[c] = array[r, c]; 
      } 
      t.Rows.Add(newRow); 
     } 

     return t.DefaultView; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

e l'utilizzo:

<DataGrid ItemsSource="{Binding Matrix, Converter={StaticResource BoolArrayToDataViewConverter}}"/> 

e questo è ciò che sembra nella versione molto crudo. È quindi possibile acconciare DataGrid e modificare sia i modelli, ma questa è un'altra questione ...

UI

+0

Tuttavia non voglio un collegamento bidirezionale. grazie mille cercherò di tornare a voi – user1221765

+0

Ottengo questi seguenti errori: http://s21.postimg.org/mn5qugbdj/errors.png – user1221765

+0

@ user1221765 È necessario modificare un po 'l'esempio, perché è scritto per una matrice personalizzata genere. È abbastanza facile, però, è necessario sostituire la matrice con il tipo di dati che stai usando (bool [] []?) E cambiare l'assegnazione di righe e colonne, rows = array.length, columns = array [0] .length (controlla prima null), per esempio. Risparmia completamente gli arrotondamenti, come non arrotondare i tuoi bool, vero? Riesci a farlo, o hai bisogno di un consiglio? – Marc

Problemi correlati