Laden...

Databinding kann nicht gefunden werden

Erstellt von tobi45f vor 3 Jahren Letzter Beitrag vor 3 Jahren 902 Views
T
tobi45f Themenstarter:in
59 Beiträge seit 2017
vor 3 Jahren
Databinding kann nicht gefunden werden

Hallo zusammen,

aus irgendeinem Grund möchte er das Binding nicht finden und leider verstehe ich nicht warum:> Fehlermeldung:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=polyline2'. BindingExpression:Path=Points; DataItem=null; target element is 'ItemsControl' (Name='test'); target property is 'ItemsSource' (type 'IEnumerable')

Ich habe eine Anzeige erstellt in der ein Graph mit Datenpunkten angezeigt wird, also Polyline mit Itemscontrol für die Punkte.
Diese habe ich zwei Mal in meinem View. Einmal im Datagrid unter den RowTemplateDetails, wo sowohl Polyline und Datenpunkte angezeigt werden und einmal in einem Grid mit ScrollViewer über ToolTip, wo nur die Polyline angezeigt wird, aber nicht die Datenpunkte, was ich nicht verstehe.


<TabItem Header="hier gehen die Datenpunkte">
   <DataGrid DataContext="{Binding MyViewModel}" ItemsSource="{Binding MyCollection}">
      <DataGrid.RowDetailsTemplate>
         <DataTemplate>
            <Border>

               <Polyline x:Name="polyline" Stroke="Blue" StrokeThickness="2" Points="{Binding GraphCollection, Converter={StaticResource PointConverter}}"/>
               <!--Datenpunkte-->
               <ItemsControl ItemsSource="{Binding Points, ElementName=polyline}">
                  <ItemsControl.ItemsPanel>
                     <ItemsPanelTemplate>
                        <Canvas/>
                     </ItemsPanelTemplate>
                  </ItemsControl.ItemsPanel>
               <ItemsControl.ItemContainerStyle>
                  <Style TargetType="{x:Type ContentPresenter}">
                     <Setter Property="Canvas.Left" Value="{Binding X}"/>
                     <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                  </Style>
               </ItemsControl.ItemContainerStyle>
               <ItemsControl.ItemTemplate>
                  <DataTemplate>
                     <Line Stroke="Blue" StrokeThickness="7" StrokeStartLineCap="Square" StrokeEndLineCap="Square"/>
                  </DataTemplate>
               </ItemsControl.ItemTemplate>
            </ItemsControl>


<TabItem Header="hier nicht" DataContext="{Binding MyViewModel}">
   <Grid>
      <ScrollViewer>
         <Grid>
            <ItemsControl ItemsSource="{Binding MyCollection}">
               <ItemsControl.ItemTemplate>
                  <DataTemplate>
                     <Grid>
                        <Polyline> <!-- Anzeige von ebenfalls Polylines, die aus MyCollection generiert werden, die aber nicht das Problem darstellen-->
                        <Polyline.ToolTip>
                           <ToolTip>
                              <Grid>

                                 <Polyline x:Name="polyline2" Stroke="Blue" StrokeThickness="2" Points="{Binding GraphCollection, Converter={StaticResource PointConverter}}"/> <!--Wird dargestellt-->
                                 <!--Datenpunkte-->
                                 <ItemsControl x:Name="test" ItemsSource="{Binding Points, ElementName=polyline2}"> <!-- Kann die Referenz nicht finden!?-->
                                    <ItemsControl.ItemsPanel>
                                       <ItemsPanelTemplate>
                                          <Canvas/>
                                       </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                 <ItemsControl.ItemContainerStyle>
                                    <Style TargetType="{x:Type ContentPresenter}">
                                       <Setter Property="Canvas.Left" Value="{Binding X}"/>
                                       <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                                    </Style>
                                 </ItemsControl.ItemContainerStyle>
                                 <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                       <Line Stroke="Blue" StrokeThickness="7" StrokeStartLineCap="Square" StrokeEndLineCap="Square"/>
                                    </DataTemplate>
                                 </ItemsControl.ItemTemplate>
                              </ItemsControl>

Der Unterschied liegt ja am Ort des DataContext und der ItemsSource. Die Referenz ist ja dieselbe und auch der Inhalt wird angezeigt - Ich verstehe leider nicht, warum er einmal {Binding Points, ElementName=polyline} findet und einmal nicht, da er die restlichen Inhalte ja darstellt?

Grüße Tobias

2.078 Beiträge seit 2012
vor 3 Jahren

Den genauen Grund kann ich dir nur mit dem Code nicht sagen, da müsste ich genauer nachforschen.

Ich kann dir aber sagen:
Namen in einem Template sind oft ein schwieriges Thema, im selben Template sollten sie aber funktionieren.
Und wenn Du dich noch in einem Adorner (nichts anderes ist ein ToolTip) befindest, wird das mit dem VisualTree noch mal spannender.

Beides sollte bei dir kein Problem sein, allerdings müsste ich das genauer nachforschen, ob ich etwas übersehen habe.
Am DataContext liegt das jedenfalls nicht, da Du wegen "ElementName" eine neue Quelle (nämlich das Control) festlegst, sodass der DataContext nicht verwendet wird.

Aber warum bindest Du denn an eine DependencyProperty vom Control und nicht direkt an das ViewModel? Ist einfacher, funktioniert besser und ist offensichtlicher.

T
tobi45f Themenstarter:in
59 Beiträge seit 2017
vor 3 Jahren

Hi,

oh ich sehe grade, dass ich damals gar keine Antwort verfasst hatte! 🤔

Vielen Dank für deine Antwort. Dass ich es über ein binding an das ViewModel einfach und direkt binden kann ist klar und funktioniert auch.
Mich hat hauptsächlich interessiert, warum sich das andere binding nicht gleich verhält, um es zu verstehen 😉

2.078 Beiträge seit 2012
vor 3 Jahren

Dazu kann ich dir nichts sagen und mir fehlt leider die Lust, ein minimales Test-Projekt mit genau dem gleichen Verhalten zusammenzubauen 😛

Der Code alleine sieht jedenfalls korrekt aus.