Laden...

[solved] Problem mit TreeView und Drag-n-Drop

Erstellt von Hunv vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.944 Views
Hunv Themenstarter:in
193 Beiträge seit 2005
vor 10 Jahren
[solved] Problem mit TreeView und Drag-n-Drop

Hi

ich habe folgendes Problem. Ich habe in WPF ein Treeview erstellt, welches noch ein paar mehr Funktionalitäten hat. Dazu habe ich ein eigenes TreeViewItem erstellt, welches u.a. ein Icon anzeigen kann. Auch Drag-n-Drop ist implementiert um ein Eintrag an eine andere Stelle im TreeView ziehen zu können.
Die Einträge des Treeviews werden via TreeView.Resources angezeigt und in mein TreeViewItem "umgewandelt".

Nun habe ich das Problem, dass die Root-Elemente des Treeviews dieses Style nicht annehmen. Alle andere TreeViewItems, die den Root-Elementen untergeordnet sind, zeigen das Style korrekt an. Die Root-Elemente werden also z.B. ohne Icon als standard TreeViewItem angezeigt.
Wenn ich den letzten Teil für das Drag-n-Drop rausnehme (den Teil mit TreeView.ItemContainerStyle), dann wird alles korrekt angezeigt, aber Drag-n-Drop funktioniert natürlich nicht mehr.

Hat jemand eine Idee warum das Verhalten so ist und was ich dagegen tun kann?

Hier der XAML-Code:

<my:ImagedConnectionTreeViewControl Background="#FFFFFFFF" Foreground="#FFFFFFFF" Margin="0,-2,0,0" x:Name="tvConnectionList" BorderThickness="0" SelectedItemChanged="tvConnectionList_SelectedItemChanged" AllowDrop="True" >
	<TreeView.ContextMenu>
		<ContextMenu>
			<MenuItem Command="my:ImagedConnectionTreeView.AddFolder" Header="Add Folder" IsEnabled="True" />
			<MenuItem Command="my:ImagedConnectionTreeView.AddSetting" Header="Add Connection" IsEnabled="True" />
		</ContextMenu>
	</TreeView.ContextMenu>
	<TreeView.Resources>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<Setter Property="HeaderedItemsControl.HeaderTemplate">
				<Setter.Value>
					<DataTemplate>
						<StackPanel Orientation="Horizontal"
									Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}">
							<Image Height="16" Source="{Binding Path=Icon, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}" Stretch="Fill" Width="16" />
							<TextBlock Text="{Binding}" />
						</StackPanel>
					</DataTemplate>
				</Setter.Value>
			</Setter>
		</Style>
	</TreeView.Resources>
	<TreeView.ItemContainerStyle>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
			<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
			<EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
		</Style>
	</TreeView.ItemContainerStyle>
</my:ImagedConnectionTreeViewControl>

Visit me @ www.beremote.net

5.299 Beiträge seit 2008
vor 10 Jahren

Du musst nicht das DragEnter jedes einzelnen TreeviewItems behandeln, du kannst das DragEnter des Treeview insgesamt behandeln - der sendet für jedes Item ein DragEnter, wenn das Draggin dieses Item entert. Weil das ist ja ein RoutedEvent.
Dein coden eines speziellen TreeviewItems scheint mir auch abenteuerlich - mach dich mal über MVVM schlau, weil normalerweise braucht man sowas nicht, wenn man nachm MVVM-Pattrn vorgeht.
gugge vlt. WpfTreeview-Tut - aber da ist das Viewmodel in VB gecodet.

oder gugge Simplifying the WPF TreeView by Using the ViewModel Pattern
dassis c#, aber englisch.

Der frühe Apfel fängt den Wurm.

Hunv Themenstarter:in
193 Beiträge seit 2005
vor 10 Jahren

Hi ErfinderDesRades,

noch eine Kurze Rückmeldung:
der Hinweis mit nicht jedes einzelne Item behandeln war die Lösung, danke!
Dass das MVVM-Pattern derzeit nicht ganz eingehalten wird, ist mir bewusst. Das ist mein erstes WPF-Projekt und die Erfahrung wächst mit der Zeit. Wenn ich weiß was ich tue, werde ich das Control auch nochmal neu schreiben, aber im Moment muss es erstmal nur laufen 😉

Zu Vollständigkeit:
Nachdem ich

<TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.ItemContainerStyle>

durch

<TreeView.Style>
                <Style TargetType="{x:Type my:ImagedConnectionTreeViewControl}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.Style>

ersetzt habe, war alles wie gewünscht!

Danke nochmal!

Visit me @ www.beremote.net