2016-12-02 3 views
0

Ich versuche einen Weg zu finden, ein WPF-Datagrid an eine unbekannte Anzahl von Strings zu binden, die ich aus einer durch Tabulatoren getrennten Textdatei gelesen habe. Ich habe einen Blick, dass ich die Datacontext hinter für den Code festgelegt, und ich dachte, ich würde nur das Datenraster im Konstruktor Code wie folgt ein:C# -WPF-Datagrid-Bindung an ObservableCollection-Mitglieder

public MainWindow(FileParametersViewModel vm) 
{ 
    InitializeComponent(); 
    DataContext = vm; 
    dataGrid.ItemsSource = vm.lParams; 
    for (int i = 0; i < vm.ParamNames.Count(); i++) 
    { 
     DataGridTextColumn col = new DataGridTextColumn(); 
     col.Binding = vm.lParams.pArray[i]; 
     col.Header = vm.ParamNames[i]; 
     dataGrid.Columns.Add(col); 
    } 
} 

Das Ansichtsmodell ObservableCollection lParams hat, die ich will binden das Datagrid:

private ObservableCollection<FileSheetParameters> _lParams; 
public ObservableCollection<FileSheetParameters> lParams 
{ 
    get { return _lParams; } 
    set 
    { 
     if (value != _lParams) 
     { 
      _lParams = value; 
      NotifyPropertyChanged("lParams"); 
     } 
    } 
} 

Jede Spalte wird in den FileSheetParameters (pArray) zu einem Mitglied einer Liste gebunden werden:

public class FileSheetParameters 
{ 
    public FileSheetParameters() 
    { 
     SheetExists = false; 
     IsPlaceholder = false; 
     pArray = null; 
    } 

    public bool SheetExists { get; set; } 
    public bool IsPlaceholder { get; set; } 
    public List<string> pArray { get; set; } 
} 

ich bevölkern die Liste von e ach Zeile der Textdatei, wie ich es gelesen habe.

Mein Problem ist, dass ich lParams.pArray eigentlich nicht referenzieren kann, wie ich es im ersten Codeblock mache. Ich bekomme einen Kompilierfehler (und auch den roten Squiggly), dass "ObservableCollection keine Definition für 'pArray' enthält. Aber pArray ist ein Mitglied der Klasse der Dinge, die in der Sammlung sind. Was mache ich falsch? ?

Wenn ich nur die Items-Quelle des Datenraster festlegen und keine spaltenspezifische Bindung, dann bekomme ich ein leeres Raster mit einer letzten Spalte, die pArray heißt und jede Zelle sagt "(Collection)". ... hinter

die Bindung Befehl im Code: ich habe eine Datatable statt einem ObservableCollection, aber das Verhalten ist nicht das, was ich mag

Antwort

0

Dies mich nervte die ganze Nacht, und ich fand nur die Lösung verwendet sollte li aussehen ke this:

string path = String.Format("pArray[{0}]", i); 
    col.Binding = new Binding(path); 

Und dann wird das Datagrid korrekt ausgefüllt.