Wie binde ich den Inhalt eines WPF-Steuerelements an den DataContext seines Containers, damit ich einen DataTemplateSelector basierend auf diesem Objekt anwenden kann?
-
15-11-2019 - |
Frage
Ich versuche, ein WPF-Fenster an ein ViewModel zu binden, das zwei Sammlungen, A und B, enthält.Ich versuche, DataTemplates zu verwenden, um entweder A oder B anzuzeigen, abhängig von der Einstellung eines Flags in meinem ViewModel.
Zu diesem Zweck habe ich die Fenster eingestellt DataContext = ViewModel
.Wenn ich jedoch versuche, a zu binden ContentControl
auf diesen DataContext und wenden Sie a an DataTemplateSelector
dazu, die item
Parameter des Selektors SelectTemplate(object item, DependencyObject container)
Methode ist immer null:
<Window [snip] Title="MainWindow">
<Window.Resources>
<!-- DataTemplate and Selector declarations -->
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource templateSelector}" />
</Grid>
</Window>
Wie soll ich das binden? ContentControl
so dass das ViewModel des Fensters an sein Fenster weitergeleitet wird DataTemplateSelector
?
Lösung
das hat bei mir funktioniert:
<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContentTemplateSelector="{StaticResource templateSelector}" />
Bearbeiten:
Ich stimme jedoch mit Aaron überein, dass dies möglicherweise nicht der beste Weg ist, Dinge zu erreichen.Sie sagten, Sie verwenden ein ViewModel.Der einfachste Weg wäre wahrscheinlich, Ihr ItemsControl an eine neue „SelectedCollection“-Eigenschaft in Ihrem Viewmodel zu binden, die die gewünschte Sammlung verfügbar macht.Dann können Sie in Ihrem Flag (vorausgesetzt, es handelt sich um eine Eigenschaft) die Eigenschaft geändert für „SelectedCollection“ auslösen.
Andere Tipps
Hier ist viel los...
Sie sagten, Sie verwenden das DataTemplateSelector
um entweder Sammlung A oder Sammlung B anzuzeigen, während Sie gleichzeitig angegeben haben, dass Sie eine der Sammlungen als festlegen DataContext
des Fensters.
Wenn Sie die Daten in einer Sammlung ausblenden möchten, führen Sie eine Filterung für die Sammlung selbst durch.Ein anderer Ansatz besteht darin, die Bindung durch einen zu führen IValueConverter
oder IMultiValueConverter
.Eine weitere Lösung könnte darin bestehen, zwei UI-Elemente an jede Sammlung zu binden und diese zu ändern Visiblity
des UI-Elements basierend auf dem Wert in Ihrem ViewModel.
Es gibt viele verschiedene Optionen ... und wenn ich Sie richtig verstehe, die DataTemplateSelector
sollte nicht einer von ihnen sein.