Laden...

Forenbeiträge von Mattes80 Ingesamt 23 Beiträge

31.12.2020 - 15:21 Uhr

Anbei noch mein Code

c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace Test_TreeView
{
    /// <summary>
    /// Interaktionslogik für UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl, INotifyPropertyChanged
    {

        public void NodesFactory(DataTable InptDT, DataTable subDT, long level)
        {


            level = level + 1;


            var querryLevel =
            from itemsInputDT in InptDT.AsEnumerable()
            join itemSub in subDT.AsEnumerable() on itemsInputDT.Field<long>("GparentId") equals itemSub.Field<long>("Gid")
            where itemSub.Field<long>("level") == level - 1

            select new { Gid = itemsInputDT.Field<long>("Gid"), Gname = itemsInputDT.Field<string>("Gname"), GparentId = itemsInputDT.Field<long>("GparentId"), level = level };


            foreach (var x in querryLevel)
            {

                DataRow rowSub = subDT.NewRow();
                rowSub["Gid"] = x.Gid;
                rowSub["Gname"] = x.Gname;
                rowSub["GparentId"] = x.GparentId;
                rowSub["level"] = x.level;
                subDT.Rows.Add(rowSub);

                nodesList.Add(new NodeViewModel { Id = x.Gid, Name = x.Gname, Expand = true, Children = new ObservableCollection<NodeViewModel>() });

                nodesList.Find(gNode => gNode.Id == x.GparentId).Children.Add(nodesList.Last());

            }

            if (querryLevel.Count() > 0)
            { NodesFactory(InptDT, subDT, level); }


        }


        public event PropertyChangedEventHandler PropertyChanged;
        List<NodeViewModel> nodesList = new List<NodeViewModel>();
        TreeViewModel MyTreeModel = new TreeViewModel();



        public UserControl1()
        {
            //generic list comprising  hierarchical data- source to fill TreeViewModel
            List<GIER_Hierarchy> GIER_Hierarchy_List = new List<GIER_Hierarchy>();

            GIER_Hierarchy_List.Add(new GIER_Hierarchy(1, "root", 0));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(2, "Production B", 7));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(12, "Document Control", 17));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(17, "Engineering", 7));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(16, "Executive", 1));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(14, "Facilities and Maintenance", 7));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(10, "Finance", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(9, "Human Resources", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(11, "Information Services", 4));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(4, "Marketing", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(7, "Production", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(8, "Production Control", 7));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(5, "Purchasing", 18));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(13, "Quality Assurance", 7));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(6, "Research and Development", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(3, "Sales", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(15, "Shipping and Receiving", 18));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(19, "Tool Design", 2));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(18, "Logistic", 16));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(20, "Logistic A", 18));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(21, "Logistic A1", 20));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(22, "Logistic A1", 21));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(23, "Logistic A1", 22));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(24, "Logistic A1", 23));
            GIER_Hierarchy_List.Add(new GIER_Hierarchy(25, "Logistic A1", 24));


            if (GIER_Hierarchy_List.Count > 0)
            {

                //datatable to load data from GIER_Hierarchy_List
                DataTable InputDT = new DataTable();
                InputDT.Columns.Add("Gid", typeof(long));
                InputDT.Columns.Add("Gname", typeof(string));
                InputDT.Columns.Add("GparentId", typeof(long));

                //loading the data from  to datable
                foreach (var x in GIER_Hierarchy_List)
                {
                    DataRow rowInput = InputDT.NewRow();
                    rowInput["Gid"] = x.Gid;
                    rowInput["Gname"] = x.Gname;
                    rowInput["GparentId"] = x.GparentId;
                    InputDT.Rows.Add(rowInput);
                }

                //querring the datable to find the row with root as first level of hierachy
                var queryRoot =
                     from itemsInputDT in InputDT.AsEnumerable()
                     where itemsInputDT.Field<long>("GparentId") == 0
                     select new { Gid = itemsInputDT.Field<long>("Gid"), Gname = itemsInputDT.Field<string>("Gname"), GparentId = itemsInputDT.Field<long>("GparentId"), level = 1 };

                //creating auxiliary datatable for iterationaly querying in the subsequent levels of hierarchy
                DataTable sub = new DataTable();
                sub.Columns.Add("Gid", typeof(long));
                sub.Columns.Add("Gname", typeof(string));
                sub.Columns.Add("GparentId", typeof(long));
                sub.Columns.Add("level", typeof(long));

                //looping through the result of the querry to load the result of the query to auxiliary datable and adding nodes to list of nodes 

                foreach (var x in queryRoot)
                {
                    DataRow rowSub = sub.NewRow();
                    rowSub["Gid"] = x.Gid;
                    rowSub["Gname"] = x.Gname;
                    rowSub["GparentId"] = x.GparentId;
                    rowSub["level"] = 0;
                    sub.Rows.Add(rowSub);

                    //creating NodeViewModel and adding to the list of NodeViewModel object list

                    nodesList.Add(new NodeViewModel
                    {
                        Id = x.Gid,
                        Name = x.Gname,
                        Expand = true,
                        Children =

                            new ObservableCollection<NodeViewModel>()
                    });

                }

                //adding Collection of NodeViewModel object with the root to TreeModel

                MyTreeModel.Items = new ObservableCollection<NodeViewModel> { nodesList.Last() };

                long level = 0;


                NodesFactory(InputDT, sub, level);


            }
            else { MessageBox.Show("List of Direcitory is empty"); }


            
            
            InitializeComponent();

            // binding TreeView component with TreeModel
            GIER_catalogHierarchy.ItemsSource = MyTreeModel.Items;
        }
    }

    public class GIER_Hierarchy
    {
        public long Gid { get; set; }
        public string Gname { get; set; }
        public long GparentId { get; set; }


        public GIER_Hierarchy(long xGid, string xGname, long xGparentId)
        {
            this.Gid = xGid;
            this.Gname = xGname;
            this.GparentId = xGparentId;
        }

    }



    public class TreeViewModel
    {
        public ObservableCollection<NodeViewModel> Items { get; set; }

    }

    public class NodeViewModel : INotifyPropertyChanged
    {


        public long Id { get; set; }
        public string _Name;
        public bool _Expand;
        public string Name
        {

            get { return _Name; }

            set
            {

                if (_Name != value)
                {
                    _Name = value;
                    NotifyPropertyChanged("Name");
                }

            }
        }


        public bool Expand
        {
            get { return _Expand; }
            set
            {
                if (_Expand != value)
                {
                    _Expand = value;
                    NotifyPropertyChanged("Expand");
                }
            }
        }


        public ObservableCollection<NodeViewModel> Children { get; set; }


        #region INotifyPropertyChanged Members

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

    }

}

WPF

<UserControl x:Class="Test_TreeView.UserControl1"
             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:Test_TreeView"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TreeView x:Name="GIER_catalogHierarchy"  BorderThickness="1" 
                  MinWidth="300" MinHeight="440"  Width="Auto"      ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                  Margin="1,1,1,0"  Height="Auto">
            <TreeView.Resources>

                <HierarchicalDataTemplate  DataType= "{x:Type local:NodeViewModel}" ItemsSource="{Binding Children}"   >

                    <Grid >

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition  x:Name="Line" Width="20" />
                            <ColumnDefinition  x:Name="Rectangle" />
                            <ColumnDefinition  x:Name="Empty1" Width="10" />
                            <ColumnDefinition  x:Name="Department" />
                        </Grid.ColumnDefinitions>

                        <!--drawing Connecting Lines -->
                        <!-- Horizontal Lines -->

                        <Border Grid.Column="0"  x:Name="HorLn" Margin="9,0,0,2" HorizontalAlignment="Stretch" Height="1" BorderThickness="0,0,0,1" VerticalAlignment="Bottom">
                            <Border.BorderBrush>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="2,0" SpreadMethod="Repeat" MappingMode="Absolute">
                                    <GradientStop Color="Transparent" Offset="0" />
                                    <GradientStop Color="Transparent" Offset="0.499" />
                                    <GradientStop Color="#999" Offset="0.5" />
                                </LinearGradientBrush>
                            </Border.BorderBrush>
                        </Border>

                        <!-- Vertical Lines -->
                        <Border Grid.Column="0"  x:Name="VerLn" Margin="0,0,1,2" Grid.RowSpan="2" VerticalAlignment="Stretch" Width="1" BorderThickness="0,0,1,0" >
                            <Border.BorderBrush>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,2" SpreadMethod="Repeat" MappingMode="Absolute">
                                    <GradientStop Color="Transparent" Offset="0" />
                                    <GradientStop Color="Transparent" Offset="0.499" />
                                    <GradientStop Color="#999" Offset="0.5" />
                                </LinearGradientBrush>
                            </Border.BorderBrush>
                        </Border>

                        <!--drawing catalog shapes-->
                        <Rectangle  Grid.Column="1"    Width="14" Height="10" Stroke="Gold"  SnapsToDevicePixels="true" VerticalAlignment="Center"    >
                            <Rectangle.Fill>
                                <LinearGradientBrush EndPoint="0.5,2" StartPoint="0.5,0">
                                    <GradientStop Color="White" Offset="0"/>
                                    <GradientStop Color="Gold" Offset="0.5"/>
                                    <GradientStop Color="Honeydew" Offset="1"/>
                                </LinearGradientBrush>
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle  Grid.Column="1"    Width="7" Height="4" Stroke="Gold"  SnapsToDevicePixels="true" VerticalAlignment="Top" HorizontalAlignment="Left"  Fill="White"  />
                        <!--textblock to display the names of catalogs-->
                        <TextBlock x:Name="textBlockHeader"    Grid.Column="3" Grid.Row="1" Text="{Binding Name}"     FontSize="9"   />
                    </Grid>

                </HierarchicalDataTemplate>
                <!--trriger to expand nodes-->
                <Style TargetType="{x:Type TreeViewItem}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Expand}"  Value="True">
                            <Setter Property="IsExpanded" Value="True"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TreeView.Resources>


        </TreeView>

    </Grid>
</UserControl>

31.12.2020 - 15:16 Uhr

Hallo danke für dein Antwort durch dein Beitrag sind mir Suchbegriffe für google eingefallen und habe dann diese gefunden, das genau so ist wie ich brauche.

https://www.codeproject.com/Articles/5165491/Filling-the-WPF-TreeView-with-Multilevel-Hierarchy

Hab es mir den Code Heruntergeladen und mit VS geöffnet und gestartet. Funktioniert. Aber....

Wenn ich jetzt den Code Kopiere in mein UserControll dann funktioniert diese nicht mehr.

public partial class UserControl1 : UserControl, INotifyPropertyChanged

das INotifyPropertyChanged kann in UserControl nicht erstellt werden.

 <HierarchicalDataTemplate  DataType= "{x:Type local:NodeViewModel}" ItemsSource="{Binding Children}"   >

das {x:Type local:NodeViewModel} NodeViewModel kann nicht gefunden werden obwohl es vorhanden ist.

Was mach ich da Falsch?

30.12.2020 - 15:04 Uhr

Hallo

Warum machst du das nicht mit DataGridTextColumn?



<DataGrid x:Name="grdNames">
             <DataGrid.Columns>
                    <DataGridTextColumn
                        Width="100"
                        DisplayMemberBinding="{Binding Start, StringFormat={}{00:HH:mm:ss}}"
                        Header="Start" />
                    <DataGridTextColumn
                        Width="100"
                        DisplayMemberBinding="{Binding Ende, StringFormat={}{00:HH:mm:ss}}"
                        Header="Ende" />
                    <DataGridTextColumn
                        x:Name="sptDauer"
                        Width="100"
                        DisplayMemberBinding="{Binding Dauer, StringFormat={}{0:m\\:ss}}"
                        Header="Dauer" />
                    <DataGridTextColumn
                        Width="*"
                        DisplayMemberBinding="{Binding Bemerkung}"
                        Header="Bemerkung"/>
            </DataGrid.Columns>
 </DataGrid>

Habe das jetzt nicht getestet aber so sollte es funktionieren.

Gruß

Mattes

30.12.2020 - 14:55 Uhr

Hallo

Ich habe mit Dataset eine Tabelle erstellt "Kategorien"

In der Tabelle sind folgende Spalten drin

  • ID Key Schlüssel
  • UnterID Falls es ein Unterknoten sein soll
  • Bezeichnung Name des Knoten

Die UnterID ist so gedacht das hier die ID des Hauptitems steht und da ein Unteritems angelegt wird.

z.b.

("1", "", "Test") das ist ein Hauptitems
("2", "1" "Unter Test") das ist ein Unteritems die zu ID 1 zugeordnet wird
("3", "2" "Unter Unter Test") das ist wieder ein Unteritems die zu ID 2 zugeordnet wird.
("4", "", "Test2") Wieder ein Hauptitems

Diese Sachen sind in Dataset eingetragen und müssen nur noch ausgelesen werden.

Nun zu mein Hauptproblem wie erstellt man zu meinen Beispiel jetzt ein Baumstruktur die in TreeView dann so angezeigt wird?

Es soll ja nicht nur die Bezeichnung übertragen werden sondern auch die ID des Items. Da es vorkommen kann das die Bezeichnung 2 mal gibt.

WPF Code


        <TreeView x:Name="tv" ItemsSource="{Binding Kategorien}" Margin="0,0,499,194">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding UnterID}">
                    <TextBlock Text="{Binding Bezeichnung}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
            <TreeView.DataContext>
                <Datenbank:DataSet1/>
            </TreeView.DataContext>
        </TreeView>

Ich bin mir nicht sicher ob der XAML code richtig ist.

Wie rufe ich diese jetzt in Code Behind ab das es mir richtig angezeigt wird.

Kann mir bitte jemand ein kleines Code Beispiel geben?

Gruß

Mattes

19.12.2020 - 11:19 Uhr

Hallo Danke für die Antworten.

  1. im Router haben wir keinen zugriff.

Zu Erklärung:

Es ist eine CNC Maschine die mit einen PC mit Windows 10 gesteuert wird.

Dieser PC ist mit WLan oder per LAN verbunden.

Beim Starten von Windows wird mein WPF Form geladen und die CNC Steuerung.

Besser für die CNC Maschine ist es das die Maschine nicht mit dem Internet verbunden ist. aber ab und zu braucht man diese um eine neue Update für die CNC Steuerung downloaden zu können.

Ich habe ein WPF Forum mit Checkbox für die Einstellungen (Internet Sperren)

Wenn die Checkbox auf True ist sollen die Port 80 gesperrt werden. So das der Arbeiter beim Internet Explorer nicht mehr ins Internet (google & Co.) nicht drauf kann.

Wie gesagt auf dem Router mit der die Maschine (PC) verbunden ist kommen wir leider nicht drauf. Es wäre nur möglich den Windows 10 an dem Maschinen PC zu sperren.

19.12.2020 - 11:10 Uhr

Hab es nun verstanden.

Nur funktioniert diese nicht. Ich probiere es noch weiter ob ich es hinbekomme.

Wenn nicht dann sende ich diese Fehlermeldungen.

Ich möchte das nicht in Form1 sondern als schon als WPF, will lieber komplett in WPF bleiben.

19.12.2020 - 10:34 Uhr

du meinst den Code im Designer Reinkopieren?

19.12.2020 - 10:06 Uhr

Hallo

Wie kann man im Code behind die Ports von Netzwerk Sperren.

Es ist so das ich gerne ein PC der an der Maschine ist. das Internet sperren kann. und wenn der Support das internet braucht wieder freischalten kann.

Es müsste dann das Port 80, Port 21, Port 22, gesperrt werden.

Gibt es da eine Lösung?

Gruß

Mattes

19.12.2020 - 09:48 Uhr

Ich bekomme es Leider nicht hin.

Hab es auch schon in Form1 versucht.

Ich konnte auch kein Download finden wo man sich das im VS anschauen kann.

Mein Ziel ist es ja nur das wenn man eine Windows Anwendung auf Maximieren tut, das diese dann nicht unter meiner 2. Taskleiste ist.

es müsste doch einfacher gehen oder?
am besten in einer IF anfrage, weil in die Einstellungen kann man ja einstellen ob die 2. Taskleiste einklappbar ist oder nicht.



if this.Height="1" {

// hier der code für die Maximale Windows höhe

} elseif this.Height="80" {

// hier der code für die Maximale Windows höhe

}


18.12.2020 - 15:59 Uhr

Danke für deine Antwort.

Was für ein Projekt wählt man da dann aus? weil das AppBar finde ich bei Visual Studio nicht. Ich hatte bis jetzt immer das WPF-APP (.net Framework) dann gibt es nich WPF-APP (.net) oder muss man da diese Komponententest-App (Universelle Windows-App) benutzen?

Gruß

Mattes

18.12.2020 - 09:48 Uhr

Hallo

Ich versuche gerade eine 2. Taskleiste für Windows zu erstellen.

Das Grundprinzip funktioniert ja schon. Nur gibt es einen Wichtigen Problem.

Das Problem ist: Das bei alle Windows Programme wenn man auf Maximieren geht auf das ganze Bildschirm geht.

Es müsste so sein das wenn die 2. Taskleiste oben ist und eine Höhe von 80px hat. Das wenn man z.b. das WordPAD auf Maximieren geht. Es dann von Oben nicht bei 0px Anfängt sondern erst bei die 80px.

Genauso wenn die 2. Taskleiste Rechts ist dann ist die Breite auf 80px.

Hoffe mir kann jemand dabei Helfen.

<Window x:Class="Taskleiste.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Taskleiste"
        mc:Ignorable="d"
        Title="MainWindow" Topmost="True" MouseLeave="Window_MouseLeave" MouseEnter="Window_MouseEnter" Width="{DynamicResource {x:Static SystemParameters.MaximumWindowTrackWidthKey}}" Height="80" WindowStyle="None" Top="0" HorizontalAlignment="Left" VerticalAlignment="Top" ResizeMode="NoResize" ShowInTaskbar="False" Left="0" Background="White">
    <Grid>
        
    </Grid>
</Window>

Gruß

Mattes

29.11.2020 - 13:09 Uhr

Hallo

Danke für deine Antwort diese Code kann man sich alles sparren.

Ich hab die Lösung gefunden direkt in WPF mit dem

Width="{DynamicResource {x:Static SystemParameters.MaximumWindowTrackWidthKey}}"

funktioniert das super.

Danke diese Frage ist komplett gelöst.

29.11.2020 - 10:20 Uhr

Hallo

Danke für deine Antwort das mit dem MouseEnter und MouseLeave funktioniert super.
nur das mit Breite des gesamten Bildschirms funktioniert nicht.

Ich habe es mit Width="{Binding SystemParameters.PrimaryScreenWidth}" und mit dem Width="{Binding ElementName=System.Windows.SystemParameters}" probiert. Beides gibt keine veränderung.


<Window x:Class="WPF_Width_Height.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Width_Height"
        mc:Ignorable="d"
        Title="MainWindow" MouseLeave="Window_MouseLeave" MouseEnter="Window_MouseEnter" Width="{Binding ElementName=System.Windows.SystemParameters}" Height="80" WindowStyle="None" Top="0" HorizontalAlignment="Left" VerticalAlignment="Top" ResizeMode="NoResize" ShowInTaskbar="False">

28.11.2020 - 21:12 Uhr

Hallo

Ich möchte mein WPF Fenster so gestallten wie das Windows Tastleiste nur Oben.

Mein Window hat diese Einstellung

Title="MainWindow" Width="Auto" Height="5" WindowStyle="None" Top="0" HorizontalAlignment="Left" VerticalAlignment="Top">

Bei Width="Auto" wird aber leider nicht die Komplette Breite von Windows übernommen er nimmt immer nur 768px warum ist das so?

Wie kann man es machen wenn der Mauszeiger auf die 5px geht die Height automatisch auf 100 geht also Height="100" ?

Wenn der Mauszeiger wieder ausserhalb vom Fenster ist soll wieder Height="5" sein.

Wie kann man sowas lösen?

Gruß

Mattes

27.11.2020 - 16:17 Uhr

Hallo

Da muss ich dir Recht geben.

27.11.2020 - 13:11 Uhr

Hallo danke für deine Antwort

Das sieht ja schon mal sehr interessant aus. Das werde ich gleich mal heute Abend Testen.

Gruß

Mattes

27.11.2020 - 12:18 Uhr

Hallo

Ich wollte mal nachfragen ob es auch andere Dockingmodule gibt. Bis jetzt kenne ich für WPF nur das AvalonDock.

Ob ein Dockingmodul sinnvoll ist oder nicht kommt immer auf dem Geschmack und den umfang von Programm drauf an.

Ich finde dieses Super da der Bediener der Software die Sachen dann so Platzieren kann wie Ihm es lieber ist.

Nur eins mag ich von AvalonDock nicht. und war das es dann nur mit UserControlls funktioniert und nicht mit einen normalen WPF-Fenster.

daher würde ich gerne wissen was ihr so verwenden, vielleicht gibt es ja noch andere coole möglichkeiten.

da ist jetzt euere Meinung gefragt.

gruß

Mattes

27.11.2020 - 11:53 Uhr

Hallo

mein Beispiel war ein schlechtes Beispiel. Es geht nicht um die einzelne Steuerelemente.

Ich möchte eine Trennung Zwischen Sprachanzeigen, Datenbankanzeigen und Funktionsanzeigen.

z.b.

Die ein WPF-Fenster würde ich gern ein SprachViewModel, DatenbankViewModel, und ein FunktionViewModen und sogar ein FunktionKlasse.

Damit will ich mit selber einen Besseren Überlick beschaffen und nicht alles in einer ViewModel reinpacken.

Vielleicht denke ich ein bissen zu Kompliziert.

Ich sag ja immer warum einfach wenn es ja auch Kompliziert geht 😃

Gruß

Mattes

25.11.2020 - 20:20 Uhr

Danke für deine Antwort

Was wäre besser in XAML oder in Code Behind?

Also ist nur 1 ViewModel möglich wenn ich es Richtig verstanden habe.

Ich hätte gerne verschiedene für

ButtonViewModel
LabelViewModel
TextboxViewModel

Dazu würde noch eine Extra Klasse kommen für SQLite Abfragen.

25.11.2020 - 18:52 Uhr

Hallo

So habe ich es in dem Tutorial rausgelesen.

MVVM und DataBinding

Ich bin für jede Verbesserung dankbar will es ja auch richtig Lernen

Gruß

Mattes

25.11.2020 - 17:19 Uhr

Hallo Danke für deine Antwort.

Mein Code sieht nun so aus.

Meine Klasse:


namespace WPF_C_DB_Lernen
{
    class Binding_Klasse : INotifyPropertyChanged
    {
     
        public event PropertyChangedEventHandler PropertyChanged;

        public virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public string _ButtonName;

        public string ButtonName
        {
            get { return _ButtonName; }
            set
            {
                if (value != _ButtonName)
                {
                    _ButtonName = value;
                    OnPropertyChanged("ButtonName");
                }
            }
        }
        public void ButtonNameTest()
        {


            ButtonName = "Hallo";


        }
    }
}

mein MainWindow:


namespace WPF_C_DB_Lernen
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Binding_Klasse BindingKlasse = new Binding_Klasse();

            this.DataContext = BindingKlasse;
            
            BindingKlasse.ButtonNameTest();

        }
    }
}

Mein WPF:


<Window x:Class="WPF_C_DB_Lernen.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_C_DB_Lernen"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <local:Binding_Klasse />
    </Window.DataContext>
    
    <Grid>
        <Button x:Name="Button1" Content="{Binding ButtonName}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="121" Height="67"/>

    </Grid>
</Window>

Nun noch eine Frage, kann man auch mehrere Klassen mit DataContext machen oder nur mit 1er Klasse?

Wenn es mit mehrere geht, wie funktioniert das dann?

Gruß
Mattes

25.11.2020 - 12:54 Uhr

Hallo

Ich bin Anfänger und beschäftige mich gerade mit Binding bei WPF

Ich habe mir eine Klasse erstelle wo die Variablen drin sind.

Meine Klasse


namespace WPF_C_DB_Lernen
{
    class Binding_Klasse
    {

        public string ButtonName { get; set; }

        public void ButtonNameTest()
        {


            ButtonName = "Hallo";


        }
    }
}

mein MainWindow


namespace WPF_C_DB_Lernen
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Binding_Klasse BindingKlasse = new Binding_Klasse();
            BindingKlasse.ButtonNameTest();

          //  Button1.Content = BindingKlasse.ButtonName;


        }
    }
}

Mein WPF

<Window x:Class="WPF_C_DB_Lernen.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_C_DB_Lernen"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button x:Name="Button1" Content="{Binding Path=ButtonName}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="121" Height="67"/>

    </Grid>
</Window>

Wenn ich mein Button ein x:Name gebe und per Code mit .Content = BindingKlasse.ButtonName reinschreibe dann funktioniert das. aber es sollte ja auch ohne gehen.

Was habe ich da falsch gemacht?

Gruß

Mattes

30.10.2020 - 15:06 Uhr

Hallo

Mein Hobby ist ein bissen zu Programmieren hab bis jetzt immer mit Visual Basic programmiert.

Da ich sehr an den alten Muster von QBasic und Visual Basic 6 bin. du ich mich mit den neuen Framework .net bei Visual Basic auch schon schwer und jetzt auch noch die neue Windows Form WPF lernen.

Was denkt ihr wenn ich schon das neue WPF lerne wäre es dann auch sinnvoll gleich C# mitzulernen. Um dadurch vielleicht aus dem alten Muster rauszukommen?

oder wäre es Besser erst WPF mit Visual Basic zu lernen?

Gruß

Mattes