Wie binde ich den Inhalt eines WPF-Steuerelements an den DataContext seines Containers, damit ich einen DataTemplateSelector basierend auf diesem Objekt anwenden kann?

StackOverflow https://stackoverflow.com/questions/5036835

  •  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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top