2013-05-29 5 views
8

Ich habe eine Matrix Art Datagrid wie folgt.Wie bindet man ein 2D-Array bool [] [] an ein WPF DataGrid (unidirektional)?

enter image description here

dieses Gitter

nun ganz in XAML ausgelegt ist, wie die Werte in diese Datagridcell mit 2-dimensionalen Array einzufügen? Die Werte, die eingefügt werden müssen, müssen vom Datentyp bool (entweder TRUE oder FALSE) sein. Irgendwelche Ideen?

+0

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

Antwort

15

Hier ist meine Vorgehensweise für ein MVVM-Szenario mit einem Konverter, der ein DataView erstellt, das an die Raster ItemsSource gebunden werden kann. Es ist für einen speziellen Matrix-Datentyp, die Doppel hält, aber Sie werden es selbst zu modifizieren, um Ihre Anforderungen in der Lage:

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(); 
    } 
} 

eine Ressource definieren für den Konverter:

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

Und es wie folgt verwenden :

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

Es erlaubt keine zwei Wege, aber verbindliches, ...

EDIT

Hier ist die Version für ein Array bool [] []:

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(); 
    } 
} 

und der Nutzung:

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

Und das ist, wie es in der sehr Rohfassung aussieht. Anschließend können Sie das Datagrid-Stil und bearbeiten es Vorlagen, aber das ist eine andere Frage ...

UI

+0

Ich möchte nicht zwei-Wege-Bindung obwohl. Vielen Dank. Ich werde versuchen, und erhalten Sie zurück – user1221765

+0

Ich bekomme diese folgenden Fehler - http://s21.postimg.org/mn5qgbdj/errors.png – user1221765

+0

@ user1221765 Sie müssen das Beispiel ein wenig ändern, weil es für eine benutzerdefinierte Matrix geschrieben ist Art. Es ist jedoch ziemlich einfach, Sie müssen die Matrix durch den verwendeten Datentyp ersetzen (bool [] []?) Und die Zuweisung von Zeilen und Spalten ändern, rows = array.length, columns = array [0] .length (vorher auf Null prüfen), beispielsweise. Spare die Rundungsbits ganz, denn du wirst deine Bools nicht runden, oder? Schaffst du es, oder brauchst du einen Rat? – Marc

Verwandte Themen