Zum Inhalt springen

Datenbindung WPF


Empfohlene Beiträge

Geschrieben

Hallo Alle zusammen,

Ich habe eine Zeitefassungstool geschrieben mit Windowsform.

Das Tool funktioniert wie folgt:

1. Start Button ->wird die Statzeit in der Textbox und in erste Spate von dgv eingetragen

2. Ende Button -> wird die Endzeit in der textbox eingetragen , gleichzeitig wird die Differenz in der Textbox und die Spalte Dauer in dgv eingetragen und zeitgleich wird einen Dialogfenster geöffnet um die Bemerkungen zu schreiben

3. beim schliessen von Hauptfenster, wird die Daten in einer Textdatei geschrieben und in einem neuen Lokalen Ordner Lokal abgelegt.

 

 

das hat ja alles geklappt nun um alles noch besser zu machen bin dabei alles  mit WPF zu ersetllen.

ich habe soweit das Layout erstellt ( Bilder in Anhang ) , nun hat sich herausgestellt, dass ganz andere Datenbindung in wpf gilt als Windowsform.

habt Ihr eine Idee wie ich diese Vorhaben realisieren kann, und wie die Daten aus Textfelder und Button in dgv spalten eingetragen werden kann ?

Ich danke euch im voraus.

Der Code in windows Form:

Form1.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
using System.IO;

namespace Zeiterfassungstool
{
    public partial class Form1 : Form
    {
        //Globale Variabeln

        public DateTime startTime;
        public DateTime endTime;


        string v1 = System.Configuration.ConfigurationManager.AppSettings["k1"];
        string v2 = System.Configuration.ConfigurationManager.AppSettings["k2"];
        string v3 = System.Configuration.ConfigurationManager.AppSettings["k3"];





        public Form1()
        {
            InitializeComponent();

            btnStart.Visible = true;
            btnStart.Text = "Start";


        
        }
        //--------------------------------------START------------------------------------------------
        private void btnStart_Click(object sender, EventArgs e)
        {
            

           
            if (btnStart.Text == "Start")
            {
                this.startTime = DateTime.Now;
                textBox2.Text = startTime.ToString("HH:mm:ss");
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = textBox2.Text;
                btnStart.Text = "Ende";
            }
            else
            {
                this.endTime = DateTime.Now;
                textBox3.Text = endTime.ToString("HH:mm:ss");
                int n = dataGridView1.Rows.Count - 1;
                dataGridView1.Rows[n].Cells[1].Value = textBox3.Text;
                TimeSpan dauer;
                dauer = endTime.Subtract(startTime);
                int m = dataGridView1.Rows.Count - 1;
                dataGridView1.Rows[m].Cells[2].Value = dauer.TotalHours.ToString("0.00");

                //--------Bemerkungsdialog----------
                Bemerkung bemerkungdialog = new Bemerkung();
                bemerkungdialog.StartPosition = FormStartPosition.CenterScreen;


                if (bemerkungdialog.ShowDialog() == DialogResult.OK)
                {
                    int d = dataGridView1.Rows.Count - 1;
                    dataGridView1.Rows[d].Cells[3].Value = bemerkungdialog.getBemerkung();
                }
           

                //----------Löschen-------------------
                foreach (Control tbx in Controls)
                {
                    if (tbx.GetType() == typeof(TextBox))
                    {
                        ((TextBox)tbx).Clear();
                    }
                }
               
                btnStart.Text = "Start";
            }
        }
        //--------------------------------------ENDE------------------------------------------------
        
    


  
        //-----------------------------------Speichern-------------------------------------------
        

     
        //------------------------------------SizeChanged. NotifyIcon-------------------------------------------
        private void Form1_SizeChanged(object sender, EventArgs e)
        {

            if (this.WindowState == FormWindowState.Minimized)
            {
                notifyIcon1.Icon = SystemIcons.Application;
               
            }

            
            this.ShowInTaskbar = false;
        }   

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            
            this.WindowState = FormWindowState.Normal;

        }



        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";


            var objWriter = new System.IO.StreamWriter(testtext);

            int count = dataGridView1.Rows.Count;


            for (int row = 0; row < count; row++)
            {
                int columncount = dataGridView1.Columns.Count;
                for (int column = 0; column < columncount; column++)

                {
                    objWriter.WriteLine(dataGridView1.Rows[row].Cells[column].Value.ToString());
                }
            }
          

            objWriter.Close();

            DialogResult dialog = MessageBox.Show("Möchten Das Programm wirklich beenden?", "Programm beenden", MessageBoxButtons.YesNo);
            if (dialog == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

Dialogfenster" Bemerkung" :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Zeiterfassungstool

{
    
    public partial class Bemerkung : Form
    {
        // Interne Zugriff
        private string Speichern = "";
        // Externe Zugriff
        public string Form1 
        {
            get { return Form1 ; }
            
        }
        

        public Bemerkung()
        {
            InitializeComponent();
            
        }

        private void btnspeichern_Click(object sender, EventArgs e)
        {
            Speichern = textBox1.Text;

        }

        public string getBemerkung()
        {
            return textBox1.Text;
        
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

      
    }
}

App config :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <appSettings>
    <add key="k1" value="Pfad zum Speichern angeben " />
    <add key="k2" value="v2" />
    <add key="k3" value="v3" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  
</configuration>

 

 

Der Code in WPF:

Hauptfenster von Programm ( MainWindow.xaml:1 )

Window x:Class="Grid.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:Grid"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="600">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />

            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="14*"/>
            <ColumnDefinition Width="15*"/>
            <ColumnDefinition Width="15*"/>
            <ColumnDefinition Width="15*"/>
            <ColumnDefinition Width="15*"/>

        </Grid.ColumnDefinitions>
        <Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
            <Button x:Name="btnStart" FontSize="16" FontWeight="Bold" 
                    Background="LightSkyBlue" Height="50" Width="100" 
                    HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0"   
                    >Start</Button>
        </Grid>

        <Grid Grid.Row="0" Grid.Column="2">
            <Label FontSize="16" FontFamily="Century Gothic" 
                   FontStyle="Normal" FontWeight="Bold" Margin="5" Padding="5,5,5,5"
                   HorizontalAlignment="Center"> Start</Label>
        </Grid>
       
        <Grid Grid.Row="0" Grid.Column="3">
            <TextBox x:Name="textBox2" Margin="5,5,5,5" ></TextBox>
        </Grid>


        <Grid Grid.Row="0" Grid.Column="4">
            <Label FontFamily="Century Gothic" FontSize="16" FontStyle="Normal"
                   FontWeight="Bold"  Margin="5" Padding="5,5,5,5" 
                   HorizontalAlignment="Center">Ende :</Label>
        </Grid>

        <Grid Grid.Row="0" Grid.Column="5">
            <TextBox x:Name="textBox3"  Margin="5" ></TextBox>
        </Grid >

        <DataGrid
            Name="dataGridView1"
            Grid.Column="0"
            Grid.ColumnSpan="6"
            Grid.RowSpan="6"
            AutoGenerateColumns="False"
            Grid.Row="1"
           >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Start" FontSize="12" Width="125" Binding="{Binding Start}"/>
                <DataGridTextColumn Header="Ende" Width="125" Binding="{Binding Stop}"/>
                <DataGridTextColumn Header="Dauer" Width="70" Binding="{Binding Dauer}"/>
                <DataGridTextColumn Header="Bemerkung" Width="720" Binding="{Binding Bemerkung}"/>


            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Hauptfentser 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.Input.Manipulations;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Timereporter2;

namespace Grid
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public DateTime startTime;
        public DateTime endTime;

        public MainWindow()
        {
            InitializeComponent();
            test();
        }



        public void test()
        {
            DateTime Start = new DateTime(2020, 11, 10, 0, 0, 0);
            DateTime Stop = new DateTime(2020, 11, 10, 0, 0, 0);



            CustomDataGridRow t1 = new CustomDataGridRow(Start, Stop , 0.00 , "test");


            List<CustomDataGridRow> list = new List<CustomDataGridRow>();
            list.Add(t1);

            dataGridView1.ItemsSource = list;
            


        }
    }
}

Dialogfenster "Bemerkung" XAML :

<Window x:Class="Timereporter2.Window1"
        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:Timereporter2"
        mc:Ignorable="d"
        Title="Window1" Height="206" Width="442">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        
        <Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
            <TextBox x:Name="textBox1" Width="442" ></TextBox>
        </Grid>

        <Grid Grid.Row="1" Grid.Column="0">
            <Button x:Name="btnspeichern" Margin="15,15,15,15"  
                    FontSize="16" FontFamily="Century Gothic" 
                    FontStyle="Normal" FontWeight="Bold"   >Einfügen</Button>
        </Grid>

        <Grid Grid.Row="1" Grid.Column="1">
            <Button x:Name="Abbrechen" Margin="15,15,15,15" 
                    FontSize="16" FontFamily="Century Gothic"  
                    FontStyle="Normal" FontWeight="Bold" >Abbrechen</Button>
        </Grid>
        
        
        



    </Grid>
</Window>

Dialogfenster " Bemerkung" c#:

 

using System;
using System.Collections.Generic;
using System.Text;
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.Shapes;

namespace Timereporter2
{
    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class zWindow1 : Window
    {
       
        // Interne Zugriff
        private string Speichern = "";
        // Externe Zugriff
        public string MainWindow
        {
            get { return MainWindow; }

        }


        public Window1()
        {
            InitializeComponent();

        }

        private void btnspeichern_Click(object sender, EventArgs e)
        {
            Speichern = textBox1.Text;

        }

        public string getBemerkung()
        {
            return textBox1.Text;

        }
    }
}

 

 

 

 

BemerkungsdialogFentser.PNG

Timerecorder.PNG

Timerecorder2.PNG

ZET1.PNG

ZET2.PNG

ZET3.PNG

ZET4.PNG

ZET5.PNG

ZET6.PNG

ZET7.PNG

Geschrieben (bearbeitet)

Wie jetzt...Windows Forms oder WPF?

Wenn du WPF machst, dann macht man sowas über MVVM und nicht über Events.

Da sollte die Oberfläche komplett von der Logik getrennt sein.

Windows Forms Anwendungen sind meistens Event-Basiert, während bei WPF in 99% der Fälle MVVM verwendet wird.

Du versuchst hier eine WPF Anwendung wie eine Windows-Forms Anwendung umzusetzen.

Bearbeitet von KeeperOfCoffee
Geschrieben

Um das mal ganz grob zu erklären.

In WPF hat sich das MVVM Pattern als Best Practice herauskristallisiert und viele Techniken von XAML basieren darauf.

View: Die View ist eine XAML Datei, oft eine Page oder ein Window, und sollte im Code-Behind wenn möglich keinerlei Logik haben, besonders keine Logik die mit dem Model oder den ViewModels zu tun hat. Die View wird an ViewModels mittels DataBindings gebunden.

ViewModel: Ein ViewModel exportiert Daten zur View. Man könnte sagen es ist eine Abstraktion der View. Alle möglichen Daten abbilden, die du in der View anzeigen willst ODER auch ein Verhalten abbilden mittels Commands. (Deshalb haben Buttons die XAML Property Command).

Model: Das Model sind generell die Daten die du in der WPF Anwendung generell zur Verfügung stellen willst. Hier sind alle Properties z.B. deines User Objects definiert (für ein entsprechendes ViewModel benötigst du ja evtl. nur eine Property von hier z.B. Name).

 

Im DataContext eines UserWindows ist also ein UserViewModel, welches Daten verwendet die aus dem bereitgestellten User-Objectes aus dem Model kommt.

 

// Model
public class User
{
	public int id { get; set; }
	public string Name { get; set; }
}


// ViewModel
public class UserWindowViewModel
{
	private readonly _user;
	public UserWindowViewModel(User user)
	{
		_user = user;
	}
	
	public string Name => _user.Name;
}



// Window Anzeige
Window userWindow = new Window();
userWindow.DataContext = new UserWindowViewModel();
userWindow.ShowDialog();

// TextBlock im Window
<TextBlock Text="{Binding Name, Mode=OneWay}"/>

Das ist aaaaaabbbberr eine sehr vereinfachte Darstellung.

Meist nutzt man für MVVM heutzutage eher Frameworks wie z.B. PRISM, MVVMCross oder ReactiveUI.

Würde dir empfehlen mal das Beispiel von MVVMCross anzusehen :)

https://www.mvvmcross.com/documentation/tutorials/tipcalc/a-wpf-ui-project

Geschrieben

Ja, das Problem ist, dass WPF trotz seiner Monstrosität sich doch recht halbgar anfühlt, wenn man es so nutzen möchte, wie es mal angedacht war. Nicht umsonst hat das "patterns & practices"-Team von Microsoft ursprünglich sogar noch Prism entwickelt, um die Arbeit mit WPF zu erleichtern. Selbst intern ist man wohl mit WPF nicht zufrieden gewesen.

Meines Wissens nach wurde ja auch die Oberfläche von Visual Studio mit WPF und Prism entwickelt.

Geschrieben (bearbeitet)

Danke für die Antworten :)  wollte noch gleich hier fargen , wie kann man das Fenster solution Explorer in Visual Studio 2019 öffnen? oder soll einr neue Frage daraus werden?

Danke

Solution Explorer.PNG

Bearbeitet von MMazi

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...