Die Bindung an DataContext außerhalb der aktuellen ItemsSource-Kontext
Ich habe eine DataSet
gebunden Window.DataContext
; ich habe auch ein DataGrid
:
<DataGrid ItemsSource={Binding Tables[Items]}>
<DataGrid.Columns>
<DataGridTextBoxColumn Header={Binding Path=DataContext.Tables[Names]/Test, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} />
</DataGrid.Columns>
</DataGrid>
Im Grunde bin ich versucht, binden Sie den Header der Spalte, um die " DataTable "Namen", Spalte "Test" in der ersten Reihe.
Jedoch, die ich nicht bekommen kann es richtig. Beachten Sie, dass ich binden Sie es in Ordnung, außerhalb des DataGrid. Das Raster ItemsSource änderungen der Daten-Kontext und ich weiß nicht, wie zu finden, die außerhalb der ursprünglichen DataContext.
Es scheint, dass die Bindung gelingt; aber das problem ist, dass das aktuelle Element (in der ersten Zeile) der Tabellen[Namen] in das Fenster.DataContext verloren.
Wenn ich die DataSet-statische und Zugriff via {x:Static local:dataset} dann werden die Dinge funktionieren. Aber ich kann nicht mit statischen Datensätzen, weil es mehrere Instanzen (multi-user).
Kann jemand bitte zeigen Sie mich in die richtige Richtung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir ziemlich sicher, dass Sie tun konnte, was Sie zu tun versuchen, durch die Verwendung
RelativeSource
verbindlich.Machte ich ein kurzes Beispiel an: http://bitbucket.org/claus/wpf-bindingoutsidedatacontext
Es ermöglicht das binden an das übergeordnete Fenster, die in meinem Fall hat das viewmodel als datacontext (mit der SomethingOutsideDataContext auf Ihr Eigentum).
Sollte man sich aber bewusst sein, dies funktioniert nur mit WPF und Silverlight nicht - die 'FindAncestor, AncestorType' Zeug wurde nicht implementiert in Silverlight noch... ich bin mir nicht sicher, ob es eine andere Methode, neben der Verwendung von statischen Ressourcen.
Window
und nicht eine Art vonUserControl
alsDataContext
Eigenschaft vorhandennull
Visibility
statt), erhalte ich:System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DockPanel', AncestorLevel='1''. BindingExpression:Path=DataContext.IsFileMode; DataItem=null; target element is 'DataGridTextColumn' (HashCode=16991479); target property is 'Visibility' (type 'Visibility')
. Momentan umgehe ich das mit CodeBehind.Weiß nicht, ob dies funktionieren wird für Sie die situation, aber Sie könnten versuchen, so etwas wie dieses:
1) Geben Sie Ihrem Fenster ein Attribut Name, z.B. Name=ZeWindow.
2) Binden Sie Ihre
DataGridTextBoxColumn
Header wie dieser:Also im Grunde anstelle der Bindung an die
DataContext
desDataGrid
Sie binden an dieDataContext
desUIElement
mit Name=ZeWindow.P. S.: ich bin ziemlich neu in WPF, so könnte dies nicht mit dem Fenster, aber ich habe etwas ähnliches mit Benutzersteuerelemente
Dies ist das erwartete Verhalten tatsächlich: Die
DataContex
t fürDataGridCell
ist die entireRow.so dass man 3 Lösungen:
entweder Sie fügen Sie Ihre Bindung in der code-behind-so:
in jeder Spalte Konstruktor:
(Sie müssen einen Weg finden, um die "thisColumnIndex". Soweit ich bin besorgt, ich fügen Sie die Spalten nach rechts, nachdem ich Sie erschaffen, si ich einfach gesagt "dataGridOwner.Spalten.Count" gibt).
... oder
finden Sie einen Weg, um den dataContext, die Sie auf jede Zelle (versucht, aber es versaut schlecht, wenn die Spalte/Zeile-Virtualisierung ist auf)
... oder
hier nachschauen:
Die Bindung einer Zelle-Objekt-Eigenschaft, um ein DataGridCell in WPF DataGrid
Ich persönlich finde die erste besser zu sein, für meine Zwecke (da ich meine Spalten im code-behind-sowieso), aber das ist wirklich bis zu Sie in der Ende...
Soweit columnHeaders betroffen sind (und nur columnsHeaders, nicht Zeilen), können Sie auch erkunden Sie die "DataTemplate" Weg:
legen Sie die Spalten-header der Spalte selbst (auf diese Weise legen Sie die Spalte als DataContext für den header) und die Verwendung eines DataTemplate.
z.B.:
in jeder Spalte Klasse:
und in das dataGrid-xaml geschrieben, so etwas wie:
natürlich, meine "MyDataGridColumnHeader" - Klasse enthält Definitionen für alle Eigenschaften, die hier referenziert.
hoffe, das hilft.