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>
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?
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
Hallo
Ich habe mit Dataset eine Tabelle erstellt "Kategorien"
In der Tabelle sind folgende Spalten drin
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
Hallo Danke für die Antworten.
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.
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.
du meinst den Code im Designer Reinkopieren?
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
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
}
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
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
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.
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">
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
Hallo
Da muss ich dir Recht geben.
Hallo danke für deine Antwort
Das sieht ja schon mal sehr interessant aus. Das werde ich gleich mal heute Abend Testen.
Gruß
Mattes
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
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
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.
Hallo
So habe ich es in dem Tutorial rausgelesen.
Ich bin für jede Verbesserung dankbar will es ja auch richtig Lernen
Gruß
Mattes
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
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
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