Laden...

Binding über Presenter in ControlTemplate

Letzter Beitrag vor 12 Jahren 3 Posts 1.297 Views
Binding über Presenter in ControlTemplate

Hallo Leute,

ich möchte erreichen, dass in meiner Liste von Personen ein Tooltip/Popup erscheint, wenn der Nutzer über einen Eintrag fährt. Hier sollen dann Adressinformationen angezeigt werden. Ich weiß, dass ein Tooltip auch einfach über einen Trigger erzeugt werden kann, aber ich würde gerne das Layout komplexer stylen.
Ich habe testweise zweimal das UserControl "AdresseInfo" eingebunden - einmal als Tooltip und einmal direkt in der Row.
In meinem Beispielcode funktioniert das Binding zum UserControl "AdresseInfo" wunderbar, lediglich das Binding zum UserControl innerhalb des ToolTip-Tags geht leider nicht. Ich vermute ich habe das System hinter dem GridViewRowPresenter noch nicht korrekt verstanden. Ich vermute bald hier zu kompliziert vorzugehen. Ist es überhaupt sinnvoll über den Presenter zu binden?


 <ListView ItemsSource="{Binding Personen}" SelectedItem="{Binding SelectedPerson}">
                    <ListView.Resources>
                        <ControlTemplate x:Key="AdresseTemplate" TargetType='{x:Type ListViewItem}'>
                            <StackPanel>
                                <GridViewRowPresenter Columns="{TemplateBinding GridView.ColumnCollection}">
                                    <GridViewRowPresenter.ToolTip>
                                        <vb:AdresseInfo DataContext="{Binding Adresse}" Width="300"/>
                                    </GridViewRowPresenter.ToolTip>
                                </GridViewRowPresenter>
                                <vb:AdresseInfo DataContext="{Binding Adresse}" Width="300"/>
                            </StackPanel>
                        </ControlTemplate>
                    </ListView.Resources>
                    <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">
                            <Setter Property="Template" Value="{StaticResource AdresseTemplate}"/>
                        </Style>
                    </ListView.ItemContainerStyle>
                    <ListView.View>
                        <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding Anrede.Name}" Header="Anrede" />
                            <GridViewColumn DisplayMemberBinding="{Binding Vorname}" Header="Vorname" Width="100" />
                            <GridViewColumn DisplayMemberBinding="{Binding Nachname}" Header="Nachname" Width="100"  />
                        </GridView>
                    </ListView.View>
                </ListView>

anbei noch die dahinter liegende Klasse:



    public class Person
    {
        int PersonId { get; set; }

        Anrede Anrede { get; set; }

        Adresse Adresse { get; set; }

        string Vorname { get; set; }

        string Nachname { get; set; }
  }

Hallo,

der Tooltip bekommt kein Parentelement, daher erbst du dort nicht den DataContext so wie du es bei deinem Markup annimmst. Daher kann das Binding so nicht tun.

Eine Möglichkeit wäre den DataContext vom Tooltip explizit gegen das eigene PlacementTarget Property zu binde, weil das das Element ist was den Tooltip anzeigt, und von da aus hast du dann wieder wie gewohnt Zugriff auf die Daten.

Baka wa shinanakya naoranai.

Mein XING Profil.

Super genial! Jetzt funktioniert es. PlacementTarget war mir bisher gar nicht bekannt...

Anbei noch der funktionierende Code:


 <ListView ItemsSource="{Binding Personen}" SelectedItem="{Binding SelectedPerson}">
                    <ListView.Resources>
                        <ControlTemplate x:Key="AdresseTemplate" TargetType='{x:Type ListViewItem}'>
                            <StackPanel>
                                <GridViewRowPresenter Columns="{TemplateBinding GridView.ColumnCollection}">
                                    <GridViewRowPresenter.ToolTip>
                                        <ToolTip DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" >
                                            <vb:AdresseInfo DataContext="{Binding Adresse}" Width="300"/>
                                        </ToolTip>
                                    </GridViewRowPresenter.ToolTip>
                                </GridViewRowPresenter>
                                <vb:AdresseInfo DataContext="{Binding Adresse}" Width="300"/>
                            </StackPanel>
                        </ControlTemplate>
                    </ListView.Resources>
                    <ListView.ItemContainerStyle>
                        <Style TargetType="{x:Type ListViewItem}">
                            <Setter Property="Template" Value="{StaticResource AdresseTemplate}"/>
                        </Style>
                    </ListView.ItemContainerStyle>
                    <ListView.View>
                        <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding Anrede.Name}" Header="Anrede" />
                            <GridViewColumn DisplayMemberBinding="{Binding Vorname}" Header="Vorname" Width="100" />
                            <GridViewColumn DisplayMemberBinding="{Binding Nachname}" Header="Nachname" Width="100"  />
                        </GridView>
                    </ListView.View>
                </ListView>