Laden...

Wie komme ich an das Objekt aus dem ItemsPanelTemplate?

Erstellt von hypersurf vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.530 Views
H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 13 Jahren
Wie komme ich an das Objekt aus dem ItemsPanelTemplate?

Hallo Leute,

ich möchte in einer Anwendung Drag&Drop realisieren, sprich Items innerhalb eines Canvas verschieben.

Dafür habe ich ein entsprechendes ViewModel erstellt, welches eine Collection mit Objekten unterschiedlicher Datentypen enthält. Über einen TemplateSelector wird das entsprechende Datatemplate ausgewählt und in einem ItemsControl dargestellt. Das klappt auch problemlos.

Jetzt kommt der Teil an dem ich gerade total verzweifel: Wie komme ich per C#-Code an das im ItemsPanelTemplate definierte Canvas?


<ItemsControl ItemsSource="{Binding Path=VisualItems}" MouseLeftButtonDown="ItemsControl_MouseLeftButtonDown"
                                                                       MouseLeftButtonUp="ItemsControl_MouseLeftButtonUp"
                                                                       MouseMove="ItemsControl_MouseMove">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas AllowDrop="true"
                                    x:Name="MyCanvas"
                                    PreviewMouseLeftButtonDown="MyCanvas_PreviewMouseLeftButtonDown"
                                    PreviewMouseMove="MyCanvas_PreviewMouseMove"
                                    PreviewMouseLeftButtonUp="MyCanvas_PreviewMouseLeftButtonUp"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplateSelector>
                        <local:ControlTemplateSelector/>
                    </ItemsControl.ItemTemplateSelector>

                    <ItemsControl.ItemContainerStyle>
                        <Style TargetType="{x:Type ContentPresenter}">
                           
                            <Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
                            <Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>


    <DataTemplate x:Key="Template_StartStop">
        <Border Background="White"
            BorderThickness="3"
            CornerRadius="10"
            MinWidth="150"
            MinHeight="40" BorderBrush="Black">
            <Label Content="{Binding Path=Bezeichnung, FallbackValue=Start-Stop}" 
               VerticalAlignment="Center"
               HorizontalAlignment="Center"
               FontWeight="Bold"
               FontSize="20"/>
        </Border>
    </DataTemplate>  


        private void ItemsControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            ItemsControl contentControl = (ItemsControl)e.Source;
            Canvas cv = (Canvas)contentControl.ItemsPanel.FindName("MyCanvas", contentControl);
        }

In der zweiten Zeile gibt es eine System.InvalidOperationException

Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt.
Message="Dieser Vorgang ist nur gültig für Elemente, auf die diese Vorlage angewendet wird."

Kann mir jemand einen Tip geben, wie ich per C#-Code an das Canvas komme?

L
862 Beiträge seit 2006
vor 13 Jahren

Per Code an diese Elemente zu kommen ist so gut wie unmöglich und auch nicht wirklich sauber.

Am besten machst du es so ähnlich wie hier: http://bea.stollnitz.com/blog/?p=53

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 13 Jahren

Eine recht einfache wenn auch unschöne Lösung ist über das Loaded-Event des Canvas:


        private void MyCanvas_Loaded(object sender, RoutedEventArgs e)
        {
            _DesignCanvas = sender as Canvas;
        }

Werd's wohl erstmal so lassen, weil ich aus Zeitgründen gerade nicht weiter rumprobieren kann...