2010-12-06 7 views
5

Ich bin ein Standard-.NET Datagrid wie folgt aus:Prisma/mvvm: Bindung Spalten Datagrid

<DataGrid ItemsSource="{Binding Datensaetze}" AutoGenerateColumns="False"> 
<DataGrid.Columns> 
    <DataGridTextColumn Header="my col 1" Binding="{Binding MyCol1}"/> 
    <DataGridTextColumn Header="my col 2" Binding="{Binding MyCol2}"/> 
    <DataGridTextColumn Header="my col 3" Binding="{Binding MyCol3}"/> 
</DataGrid.Columns> 
</DataGrid> 

Diese schön funktioniert. Jetzt möchte ich die Spalten im ViewModel definieren, und anstatt feste Spalten in XAML zu setzen, möchte ich sie im laufenden Betrieb erzeugen. Wenn ich jedoch versuche, die Spalten an irgendetwas zu binden, erhalte ich einen Fehler, indem ich sage

DataGrid.Columns ist eine schreibgeschützte Eigenschaft und kann nicht gebunden werden.

Gibt es eine Möglichkeit, die DataGrid-Spalten dynamisch an etwas im Code dahinter zu binden?

Antwort

9

Ja, die Columns-Eigenschaft ist ReadOnly, so dass wir nicht direkt an sie binden können. Wenn Sie Spalten binden möchten, können Sie versuchen, eine angefügte Eigenschaft zu verwenden, an die Sie binden, wodurch wiederum die Spalten aktualisiert werden.

aktualisiert
Mit Delta von Änderungen in der Collection Veranstaltung.

Dann können Sie die BindableColumns Eigenschaft auf Ihre ColumnsCollection binden

<DataGrid AutoGenerateColumns="False" 
      local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}"> 
    <!-- ... --> 
</DataGrid> 
+0

Ich habe diese feine worden, aber ich habe auf ein Problem stoßen, wo ich die ObservableCollection auf einem Hintergrund-Thread zu aktualisieren (Ich benutze den Dispatcher, um dies zu tun). Der obige Code fällt dann in den CollectionChanged-Delegaten mit dem Fehler "der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt". Irgendwelche Vorschläge, was ich tun kann? –

+0

Ich bin in der gleichen Situation wie Andrew Stephens. Ich kann keinen Weg finden. Wer hilft? – ncourcy84

+0

Ich denke, Sie müssen zuerst die Quelle der Elemente lösen, bevor Sie sie im Hintergrund Thread aktualisieren können. Sie können nicht auf ein Objekt zugreifen, das an eine UI gebunden ist (mit raisepropertychanged/collectionchanged) im Hintergrundthread. Eine weitere Option ist die Verwendung eines anderen Objekts, auf das Sie im Hintergrundthread zugreifen sollten. Verwenden Sie dann Fortfahren mit (wenn Sie eine Aufgabe verwenden) und übergeben Sie dieses Objekt dann an den ContinueWith-Block. – Lance