none
(Wpf) Im TreeView eine Ordnerstruktur darstellen RRS feed

  • Frage

  • Hi,

    Ich möchte eine paar Ordner und Dateien in einem TreeView darstellen. Die Methode hab ich bereits erstellt. Diese funktioniert aber nur im TreeView-Loaded Event, oder Button-Click Event. Nicht aus einer anderen Klasse herraus.

    Was muß ich tun um sie ins TreeView zubekommen? Für ein kleines Beispiel wäre ich Dankbar.

    mfg

    Freitag, 29. April 2022 13:17

Antworten

  • Hi,

    hatte gestern leider keine Zeit mehr (Arbeit).

    <UserControl x:Class="SharpCodes.RightDock.ReferenceExplorerView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:SharpCodes.RightDock"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="350">
        <UserControl.Resources>
            <RoutedUICommand x:Key="AddDllCmd" Text="AddDellId" />
        </UserControl.Resources>
        <UserControl.CommandBindings>
            <CommandBinding x:Name="AddDellId" Command="{StaticResource AddDllCmd}"  Executed="AddDllCmd_Executed" />
        </UserControl.CommandBindings>
        <Grid>
            <ToolBar VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="26" Background="#FF2D2D30" Foreground="White" >
                <ToolBar.Style>
                    <Style TargetType="ToolBar">
                        <!-- Not Dropdown Button -->
                        <Setter Property="ToolBarTray.IsLocked" Value="True"/>
                        <!-- Not Overflow Button -->
                        <Setter Property="OverflowMode" Value="Never"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ToolBar}">
                                    <ToolBarPanel IsItemsHost="True" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ToolBar.Style>
    
                <Button Content="Hinzufügen" Command="{StaticResource AddDllCmd}"></Button>
            </ToolBar>
            <TreeView x:Name="TvDll" Margin="0,26,0,0" Background="#FF2D2D30" >
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type local:TreeViewItemTv}" ItemsSource="{Binding Items}">
                        <TextBlock Text="{Binding Header}" />
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Grid>
    </UserControl>

    public class TreeViewItemTv : AbstractViewModel { public TreeViewItemTv() { this.Items = new ObservableCollection<TreeViewItemTv>(); }  private string header;
            public string Header
            {
                get { return header; }
                set
                {
                    header = value;
                    OnPropertyChanged("Header");
                }
            }

            public override string ToString()
            {
                return header;
            }

    public object Tag { get; set; } public ObservableCollection<TreeViewItemTv> Items { get; set; } }

    Der Code ist zwar anders, beinhaltet jedoch das selbe Problem. Soll auch nur zum testen da sein.


            public void AddDllsToReferenceExplorer()
            {
                item = new TreeViewItemTv();
                item.Header = mainWin.ViewModel.GetProjectCSharpName;
    
    
                ReferenceView.TvDll.Items.Add(item);
            }
    Aufruf erfolgt aus ReferenceExplorerViewModel.





    • Bearbeitet Warhero68 Samstag, 30. April 2022 11:38
    • Als Antwort markiert Warhero68 Samstag, 30. April 2022 14:28
    Samstag, 30. April 2022 06:33

Alle Antworten

  • Hi,

    Du musst genau diese Instanz des Treeview Controls ansprechen. Und dazu musst Du wohl dessen übergeordnetes Element (View, Window, ...) ansprechen. Wie genau Du da vorgehen musst, hängt von deinem Projektaufbau ab.

    Schau dazu bspw. mal hier:

      How can I access a control in WPF from another class or window


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 29. April 2022 13:29
    Moderator
  • Hi Stefan!

    Das hatte ich bereits getan, war aber ohne Wirkung. Er weigert sich standhaft. Das DockWindow scheint sich auch immer zu deaktivieren, sobald eine Methode auf das TreeView zugreifen will. Hast du vieleicht noch eine Idee?

    mfg

    Edit: Sollte noch vieleicht die kleine Info schreiben, dass es sich um MVVM handelt.
    • Bearbeitet Warhero68 Freitag, 29. April 2022 14:25
    Freitag, 29. April 2022 14:07
  • Hi,

    es wäre in dem Fall wohl notwendig, dass Du uns mal deinen Code und deinen Aufbau zeigst. Wahrscheinlich ist es am sinnvollsten, wenn Du das Ganze in ein aufs absolut Notwendigste reduzierte Projekt packst und das online zum Download zur Verfügung stellst. Dann kann man sich das selbst mal anschauen.

    Zudem bitte noch die genaue und exakte Fehlermeldung posten. Es scheint ja eine zu geben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 29. April 2022 14:31
    Moderator
  • Hi,

    es gibt ja keine Fehlermeldung, die ich hätte Posten können. Das Programm läuft weiter, nur das TreeView bleibt leer. Wenn ich es aus dem Menü laden möchte.

    mfg

    Freitag, 29. April 2022 14:39
  • Ok,

    dann gibt es aber immer noch den Code, mit dem Du es versuchst. Zeig den bitte mal.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 29. April 2022 14:51
    Moderator
  • Hi,

    hatte gestern leider keine Zeit mehr (Arbeit).

    <UserControl x:Class="SharpCodes.RightDock.ReferenceExplorerView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:SharpCodes.RightDock"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="350">
        <UserControl.Resources>
            <RoutedUICommand x:Key="AddDllCmd" Text="AddDellId" />
        </UserControl.Resources>
        <UserControl.CommandBindings>
            <CommandBinding x:Name="AddDellId" Command="{StaticResource AddDllCmd}"  Executed="AddDllCmd_Executed" />
        </UserControl.CommandBindings>
        <Grid>
            <ToolBar VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="26" Background="#FF2D2D30" Foreground="White" >
                <ToolBar.Style>
                    <Style TargetType="ToolBar">
                        <!-- Not Dropdown Button -->
                        <Setter Property="ToolBarTray.IsLocked" Value="True"/>
                        <!-- Not Overflow Button -->
                        <Setter Property="OverflowMode" Value="Never"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ToolBar}">
                                    <ToolBarPanel IsItemsHost="True" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ToolBar.Style>
    
                <Button Content="Hinzufügen" Command="{StaticResource AddDllCmd}"></Button>
            </ToolBar>
            <TreeView x:Name="TvDll" Margin="0,26,0,0" Background="#FF2D2D30" >
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type local:TreeViewItemTv}" ItemsSource="{Binding Items}">
                        <TextBlock Text="{Binding Header}" />
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Grid>
    </UserControl>

    public class TreeViewItemTv : AbstractViewModel { public TreeViewItemTv() { this.Items = new ObservableCollection<TreeViewItemTv>(); }  private string header;
            public string Header
            {
                get { return header; }
                set
                {
                    header = value;
                    OnPropertyChanged("Header");
                }
            }

            public override string ToString()
            {
                return header;
            }

    public object Tag { get; set; } public ObservableCollection<TreeViewItemTv> Items { get; set; } }

    Der Code ist zwar anders, beinhaltet jedoch das selbe Problem. Soll auch nur zum testen da sein.


            public void AddDllsToReferenceExplorer()
            {
                item = new TreeViewItemTv();
                item.Header = mainWin.ViewModel.GetProjectCSharpName;
    
    
                ReferenceView.TvDll.Items.Add(item);
            }
    Aufruf erfolgt aus ReferenceExplorerViewModel.





    • Bearbeitet Warhero68 Samstag, 30. April 2022 11:38
    • Als Antwort markiert Warhero68 Samstag, 30. April 2022 14:28
    Samstag, 30. April 2022 06:33