2013-05-29 7 views
8

Posiadam datagrid typu matrycowego w ten sposób.Jak powiązać bool w tablicy 2D [] [] z danymi WPF DataGrid (w jedną stronę)?

enter image description here

ta siatka jest zaprojektowany w całości w XAML

teraz jak wstawić wartości do tych datagridcell z 2 wymiarowej tablicy? wartości, które należy wstawić, muszą być typu danych bool (PRAWDA lub FAŁSZ). Jakieś pomysły?

+0

http://stackoverflow.com/questions/276808/how-to-populate-a-wpf-grid na podstawie 2-wymiarowej tablicy –

Odpowiedz

15

Oto moje podejście do scenariusza MVVM, używając konwertera, który tworzy DataView, który może być powiązany z sieciami ItemsSource. To dla specjalnego typu danych Matrix, który posiada podwójne, ale będziesz mógł go modyfikować się do Twoich wymagań:

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

zdefiniować źródło informacji dla konwertera:

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

i używać go tak jak to :

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

nie pozwala wiążące dwukierunkowy, choć ...

EDIT

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

i użytkowania:

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

I to jest, jak to wygląda w wersji bardzo surowe. Następnie można projektować DataGrid i edytować to szablony, ale to inna kwestia ...

UI

+0

Nie chcę jednak dwukierunkowego wiązania. Dziękuję bardzo. próbuję wrócić do wersji – user1221765

+0

Otrzymuję następujące błędy - http://s21.postimg.org/mn5qugbdj/errors.png – user1221765

+0

@ user1221765 Trzeba trochę zmodyfikować przykład, ponieważ jest napisany dla niestandardowej matrycy rodzaj. To całkiem proste, musisz wymienić macierz na typ danych, którego używasz (bool [] []?) I zmienić przypisanie wierszy i kolumn, rows = array.length, columns = array [0] .length (sprawdź null przed), na przykład. Oszczędź wszystkich zaokrągleń, bo nie zaokrąglisz swoich knowań, prawda? Czy zdołasz to zrobić, czy potrzebujesz porady? – Marc