none
TreeView mit WPF-Anwendung .net 6.0 RRS feed

  • Frage

  • Hallo

    Ich habe nun ein WPF-Anwendung erstellt mit .net 6.0 Framework.

    Nun habe ich ein Problem mit dem TreeView.

    XAML:

        <Control.DataContext>
            <local:TreeViewViewModel/>
        </Control.DataContext>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="180*" />
                <ColumnDefinition Width="3" />
                <ColumnDefinition Width="500*" />
            </Grid.ColumnDefinitions>
            <Image Margin="0,0,3,0" Source="/Impages/Logo_noat_cmpi.png" Grid.ColumnSpan="2" Height="79" VerticalAlignment="Top" />
            <TreeView Margin="0,78,0,0" ItemsSource="{Binding RootItems}">
                <i:Interaction.Behaviors>
                    <local:TreeViewBehavior/>
                </i:Interaction.Behaviors>
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type local:Data_Kategorie}" ItemsSource="{Binding ChildrenItems}">
                        <TextBlock Text="{Binding KategorieName}"/>
                    </HierarchicalDataTemplate>
                </TreeView.Resources>
            </TreeView>
            <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" Background="#FF616060" />
            <DocumentViewer Grid.Column="2" Background="{x:Null}" >
            </DocumentViewer>
            <Button x:Name="Button_Video" BorderThickness="0" Grid.Column="2" Content="Video" HorizontalAlignment="Left" Margin="244,0,0,0" VerticalAlignment="Top" Height="33" Background="{x:Null}" Foreground="Black"/>
        </Grid>

    TreeViewViewModel.cs

    using System;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Interactivity;
    
    namespace NOAT_Digital_Manual
    {
        public class TreeViewViewModel
        {
            public string stKategorieNummer;
            public string stKategorieUnterNummer;
            public string stKategorieName;
            public TreeViewViewModel()
            {
                cvs.Source = (new Model()).GetData(0);
                cvs.SortDescriptions.Add(new SortDescription("KategorieReihenfolge", ListSortDirection.Ascending));
            }
    
            private CollectionViewSource cvs = new CollectionViewSource();
            public ICollectionView RootItems { get => cvs.View; }
    
            public Data_Kategorie Detail 
            { 
                set 
                {
                    stKategorieNummer = value.KategorieNummer;
                    stKategorieUnterNummer = value.KategorieUnterNummer;
                    stKategorieName = value.KategorieName;
    
                } 
            }
        }
    
        internal class Model
        {
            public Model()
            {
                // Demo-Daten erzeugen
                //Random rnd = new Random();
                //for (int i = 100; i < 1000; i++) 
    
                //    col.Add(new Data_Kategorie(col)
                //    {
                //    KategorieNummer = i,
                //    KategorieUnterNummer = (rnd.NextDouble() > .5) ? 0 : rnd.Next(100, i),
                //    KategorieName = $"Node {i}"
                //    }
                //    );
    
                //todo: Hier die Datenbankabfrage für Kategorien
                col.Add(new Data_Kategorie(col)
                    {
                    KategorieNummer = "100",
                    KategorieUnterNummer = "",
                    KategorieName = "Test"
                    }
                );
            }
    
            // Datenspeicher
            internal ObservableCollection<Data_Kategorie> col = new ObservableCollection<Data_Kategorie>();
    
            // Sicht für Root-Level
            internal ObservableCollection<Data_Kategorie> GetData(int levelID) =>
              new ObservableCollection<Data_Kategorie>(col.Where((d) => d.KategorieUnterNummer == ""));
        }
    
        public class Data_Kategorie
        {
            public Data_Kategorie(ObservableCollection<Data_Kategorie> data) => col = data;
            private ObservableCollection<Data_Kategorie> col;
            public string KategorieNummer { get; set; }
            public string KategorieUnterNummer { get; set; }
            public string KategorieName { get; set; }
            public int KategorieReihenfolge { get; set; }
            public ObservableCollection<Data_Kategorie> ChildrenItems { get => new ObservableCollection<Data_Kategorie>(col.Where((d) => d.KategorieUnterNummer == this.KategorieNummer)); }
            public bool IsExpanded { get; set; } = true;
            public bool IsSelected { get; set; }
        }
    
        public class TreeViewBehavior : Behavior<TreeView>
        {
            protected override void OnAttached() => AssociatedObject.SelectedItemChanged += AssociatedObject_SelectedItemChanged;
    
            private void AssociatedObject_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {
                var tv = sender as TreeView;
                if (tv == null) return;
                var vm = tv.DataContext as TreeViewViewModel;
                if (vm == null) return;
                vm.Detail = tv.SelectedItem as Data_Kategorie;
            }
        }
    
    
    
    
    
    }

    Das erste Problem ist das der Interactivity nicht mehr unterschützt wird und mir schon bei der Installation schon die Warnung bring.

    Das nächste ist das es nicht für .net 6.0 zur Verfügung steht.

    Gibt es da eine andere Möglichkeit?

    Gruß

    Mezzo

    Donnerstag, 20. Januar 2022 06:16

Antworten

  • Hallo Mezzo,

    Hast Du Peters Vorschlag umgesetzt und eine eigene attached property geschrieben?
    Das erste Problem ist das der Interactivity nicht mehr unterschützt wird und mir schon bei der Installation schon die Warnung bring.
    Wenn Du jedoch Interactivity beibehalten möchtest, entferne die Verweise auf Microsoft.Expression.Interactions und System.Windows.Interactivity, installiere das NuGet-Paket Microsoft.Xaml.Behaviors.Wpf und ersetze die xmlns-Namensräume
    http://schemas.microsoft.com/expression/2010/interactivity
    http://schemas.microsoft.com/expression/2010/interactions
    durch http://schemas.microsoft.com/xaml/behaviors . Ersetze in den C#-Dateien die entsprechenden usings durch:

    using Microsoft.Xaml.Behaviors;

    Für weitere Informationen verweise ich Dich auf folgende Links:
    How to add System.Windows.Interactivity to project?
    Open Sourcing XAML Behaviors for WPF

    Gruß,
    Dimitar

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert Mezzo80 Montag, 7. Februar 2022 07:17
    Mittwoch, 2. Februar 2022 09:19
    Administrator

Alle Antworten

  • Hi Mezzo,
    du kannst eine eigene attached property schreiben und diese anstelle der Interactivity.dll nutzen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 20. Januar 2022 14:48
  • Hallo Mezzo,

    Hast Du Peters Vorschlag umgesetzt und eine eigene attached property geschrieben?
    Das erste Problem ist das der Interactivity nicht mehr unterschützt wird und mir schon bei der Installation schon die Warnung bring.
    Wenn Du jedoch Interactivity beibehalten möchtest, entferne die Verweise auf Microsoft.Expression.Interactions und System.Windows.Interactivity, installiere das NuGet-Paket Microsoft.Xaml.Behaviors.Wpf und ersetze die xmlns-Namensräume
    http://schemas.microsoft.com/expression/2010/interactivity
    http://schemas.microsoft.com/expression/2010/interactions
    durch http://schemas.microsoft.com/xaml/behaviors . Ersetze in den C#-Dateien die entsprechenden usings durch:

    using Microsoft.Xaml.Behaviors;

    Für weitere Informationen verweise ich Dich auf folgende Links:
    How to add System.Windows.Interactivity to project?
    Open Sourcing XAML Behaviors for WPF

    Gruß,
    Dimitar

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert Mezzo80 Montag, 7. Februar 2022 07:17
    Mittwoch, 2. Februar 2022 09:19
    Administrator