Laden...

Forenbeiträge von Kriz Ingesamt 141 Beiträge

09.07.2018 - 10:31 Uhr

Servus,

Wie der Titel schon sagt, ich würde gern im XAML Code auf eine Datei im besagten Ordner zugreifen.
Wenn ich es mit "C:/user/usw..." versuche, dann wird das Verzeichnis "C:/user" erstellt.
In c# benutze ich ja Envoiroment.SpecialFolder, aber was mache ich bei XAML?

Vielen Dank!
Kriz

02.06.2018 - 15:34 Uhr

Servus zusammen!

Es gibt sicher zig verschiedene Herangehensweisen für das Verwalten von Einstellungen in einer Software. Speichern in der Registry, in einer INI Datei, in einer Datenbank, usw...
Gibt es denn etwas das Ihr besonders bevorzugt, oder absolut verabscheut?

Hintergrund ist, dass ich aktuell das Modell "Serialisieren/Deserialisieren" nutze und mich frage ob es da nicht etwas besseres/schnelleres/einfachrereres gibt...

Kriz

23.05.2018 - 05:00 Uhr

@ MrSparkle

Screenshots sind angefügt, aber den DateiUpload konnte ich nicht nutzen, es wird ein Fehler angezeigt. Evtl weil die Datei zu groß ist?

23.05.2018 - 04:58 Uhr

noch ein Screenshot

23.05.2018 - 04:55 Uhr

weiterer Screenshot

22.05.2018 - 19:20 Uhr

Hi pearsh.

Nein, die Anwendung ist nicht open source.

Kriz

22.05.2018 - 05:23 Uhr

Servus zusammen!

Hier mal ein Projekt von mir an dem ich arbeite, Wer möchte und Zeit hat, schaut es sich mal an und kritisiert mich mal fleißig 😃

Es ist ein Programm was zur Dienstplangestaltung in der Gastronomie dient.
Aktuell kann man den erstellten Plan nur ausdrucken, es soll aber auch noch möglich sein (im Rahmen von DSGVO) den Dienstplan im Internet abrufen zu können.

Funktionen sind:

  • Erstellen und Bearbeiten von Mitarbeitern
  • Mitarbeitergruppen, Verträge, Qualifikationen
  • Dienstpläne erstellen, speichern, laden und ausdrucken
  • erstellte Dienstpläne mit verschiedenen "Checks" kontrollieren (Ausreichend Mitarbeiter vorhanden, Mitarbeiter mit nötigen Qualifikationen vorhanden, usw...)

Download

Kriz

30.03.2018 - 14:30 Uhr
public static void SaveRota(Rota GivenRota)
        {
            Stopwatch neww = new Stopwatch();
            neww.Start();
            SQLiteConnection connection = new SQLiteConnection() { ConnectionString = Properties.Resources.DBConnectionString };
            SQLiteCommand command = new SQLiteCommand(connection);
            string DBConnectionString = Properties.Resources.DBConnectionString;
            connection.Open();
            command.CommandText = "SELECT Max(RotaEntryID) FROM RotaEntry";
            SQLiteDataReader reader = command.ExecuteReader();
            int EntryID = 0;
            int ScheduleEntryID = 0;
            string SQLCommand = "";
            while (reader.Read())
            {
                EntryID = int.Parse(reader[0].ToString()) +1;
            }
            reader.Close();
            command.CommandText = "SELECT MAX(DayEntryID) From DayEntry";
            reader = command.ExecuteReader();
            while (reader.Read())
            {
                ScheduleEntryID = int.Parse(reader[0].ToString()) +1;
            }
            reader.Close();

            foreach (var employee in GivenRota.ListOfEmployee)
            {
                Stopwatch WatchEmp = new Stopwatch();
                WatchEmp.Start();
                if (!employee.HasWeekOff())
                {
                    int[] DayEntryID = new int[7];
                    int DayCounter = 0;
                    foreach (var day in employee.plannedSchedulesThisWeek)
                    {
                        Stopwatch WatchDay = new Stopwatch();
                        WatchDay.Start();
                        if (day.ID == 0)
                        {
                            DayEntryID[DayCounter] = 0;
                        }
                        else
                        {
                            string BreakString = "";
                            if (day.ListOfBreaks.Count > 0)
                            {
                                foreach (var bre in day.ListOfBreaks)
                                {
                                    BreakString += bre.Start + "-" + bre.End + ";";
                                }
                                BreakString.Trim(';');

                            }
                            SQLCommand += String.Format("INSERT INTO DayEntry (plannedScheduleID, Start, End, Break) VALUES ('{0}','{1}','{2}','{3}');", day.ID, day.Start, day.End, BreakString);
                            DayEntryID[DayCounter] = ScheduleEntryID;
                            ScheduleEntryID++;
                        }
                        WatchDay.Stop();
                        Debug.WriteLine(WatchDay.Elapsed.ToString() + " für Schedule");
                        DayCounter++;
                    }

                    SQLCommand += String.Format("INSERT INTO RotaEntry (RotaEntryID, EmployeeID, ScheduleDay0, ScheduleDay1, ScheduleDay2, ScheduleDay3 ,ScheduleDay4, ScheduleDay5, ScheduleDay6) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}');"
                                                                                , EntryID, employee.ID, DayEntryID[0], DayEntryID[1], DayEntryID[2], DayEntryID[3], DayEntryID[4], DayEntryID[5], DayEntryID[6]);
                    command.ExecuteNonQuery();
                }
                WatchEmp.Stop();
                Debug.WriteLine(WatchEmp.Elapsed.ToString() + " für Mitarbeiter " + employee.Showingname);
            }
            SQLCommand += String.Format("INSERT INTO Rota (StartDate, Name, Entry, Note, IsPublished) VALUES ('{0}','{1}','{2}','{3}','{4}')"
                                            , GivenRota.StartDate, GivenRota.Name, EntryID, GivenRota.Note, GivenRota.isPublished);
            
            command.CommandText = SQLCommand;
            command.ExecuteNonQuery();
            
            command.Dispose();
            connection.Close();
            connection.Dispose();
            neww.Stop();
            Debug.WriteLine(neww.Elapsed.ToString() + " für Function");

Das ist de Funktion...
Vorher hatte ich an den Stellen wo ich SQLCommand weitere INSERTs hinzufüge den INSERT direkt aufgerufen, also mit ExecuteNonQuery, das hat dann ungefähr 1min gedauert, nun habe ich einen "MonsterString" erstellt, jetzt dauert es noch ca 30 Sekunden.
Nun hab eich etwas weiter gegoogelt und "BeginTransaction" und "Commit" gefunden. Damit dauert es noch 1,2 Sekunden. Damit ist das Problem also gelöst.
Wenn Du allerdings an meiner Datenbankverarbeitung noch Verbesserungen siehst immer her damit!

Vielen Dank!
Kriz

30.03.2018 - 12:08 Uhr

So, ich habe mich mit dem Thema Normalisierung auseinandrr gesetzt und meine Datenbank dem enzsprechend umgestaltet. Ergibt auch alles Sinn und gefällt mir auch gut.
Nun habe ich allerdings das Problem, dass ein einfacher Speichervorgang, also das Eintragen in die Datenbank, statt 3 Sekunden (vorher), nun bis zu 45 Sekunden dauert.
Ergibt ja auch Sinn, wo es vorher nur ein INSERT war, sind es jetzt einige mehr, jede Schedule, jeder Break wird ja seperat eingetragen.

Meine Frage: Wie kann ich dad Speichern verkürzen? Gibt es auch da bestimmtr Grundlagen/Techniken die mir da weiter helfen könnten?

21.03.2018 - 21:55 Uhr

Schonmal vielen Dank dafür!!!
Das hat geholfen!

Wie wird es denn normalerweise mit dem Trennen von Datenbanken gehandhabt? Ich speicher in ein und der selben Datenbank sowohl Dienstpläne, als auch Mitarbeiterinformationen wie Adresse, Telefonnumer, usw.
Sollte sowas besser in eine andere Datenbank ausgelagert werden oder spricht nichts dagegen alles in einer zu "sammeln"

21.03.2018 - 21:13 Uhr

Ich tuh mich da etwas schwer...

Wenn ich die Spalte "Entry" auslager in eine separate Tabelle, dann hätte diese Tabelle folgende Spalten: EntryID, DayID, EmployeeID, ScheduleID, Start, End, Breaks. Dann würde ein Dienstplan mit beispielsweise 30 Mitarbeitern 210 Datensätze (jeder Mitarbeiter 7 Tage) erzeugen. Ist das noch praktikabel? Oder habe ich einen Denkfehler?

21.03.2018 - 20:05 Uhr

verwendetes Datenbanksystem: SQLite

Hi zusammen, ich habe weniger eine technische, mehr eine "Logik-Frage"...

Ich sitze an einem Programm zur Dienstplangestaltung, gespeichert werden die Dienstpläne in einer SQLite Datenbank.

Aktuell gehe ich folgendermaßen vor:

Der Dienstplan ist die Klasse "Rota", diese Klasse "Rota" hat eine List<Employee>, jeder Eintrag in der List<Employee> hat wiederum eine List<Schedule>, jeder Eintrag dieser List<Schedule> besteht aus einer ScheduleID und einer List<Break>, die List<Break> bestehen aus Start und Ende, ich versuchs mal so zu erklären:

Rota:

  • StartDate
  • Name
  • Note
  • ID
  • <List>Employee
    • ID
    • <List>Schedule
      • ID
      • <List> Break
        • Start
        • Ende

In meiner Datenbank habe ich eine Tabelle, in der ich die Dienstpläne speicher. Diese Tabelle hat die Spalten Name, ID, StartDate, Note, Entry. Wobei die Spalte Entry ein String ist, der sich durch die EmployeeID, DayID, ScheduleID, usw zusammensetzt. Der String sieht für einen Mitarbeiter beispielsweise folgendermaßen aus:

33:0#1$07:00:00-13:00:00;08:00:00/08:00:00

(Mitarbeiter ID 33, TagID 0, ShiftID 1, von 07:00 bis 13:00, eine Pause von 08:00 bis 08:30)

Für jeden weiteren Tag und jeden weiteren Mitarbeiter wird der String länger und länger, für einen komletten Dienstplan kommen da schonmal 10.000 Zeichen zusammen.
Zwar funktioniert es so, aber ich befürchte dass, je länger der String wird, je mehr Fehler können sich einschleichen.

Was für andere Lösungsansätze hättet Ihr für das Problem?

Vielen Dank!!!

Kriz

19.03.2018 - 13:36 Uhr

warum 'object' ? Gibt es keinen Typen dazu?

Weil die ObservableCollection mit einer Datenbankabfrage gefüttert wird die viele verschiedene Typen abfragen kann/soll, da fand ich es am einfachsten mit "object" zu arbeiten.

Ich fad für die Problematik leider keinen anderen Lösungsansatz, da zwar das Objekt bearbeitet werden konnte und die Änderungen auch im Urpsrung, also UserControl, korrekt angezeigt wurden, sobald ich aber dem Objekt ein neues zuweisen wollte, wurde nichts übernommen. So funktioniert es nun.

Wenn es eine einfachere, bzw MVVM-passendere Lösung gibt, dann her damit 😃

19.03.2018 - 12:33 Uhr

StackOverflow sei dank, Problem gelöst!

Falls jemand mal vor dem gleichen Problem steht: Die Lösung ist das ganze ViewModel als Parameter an das neue Window zu geben, nicht nur das eine Objekt, dann wird auch ein neu erstelltes Objekt übernommen.

Trotzdem Danke!

19.03.2018 - 09:26 Uhr

Hier mal noch ein paar Code-Snippets, vllt hilfts bei der Kärung...

User-Control-XAML:

<Label Content="{Binding Path=SelectedSchedule.Name}" Margin="0,-6,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20" Height="32" Width="87"/>

User-Control-ViewModel

 private Schedule mSelectedSchedule;

    public Schedule SelectedSchedule
    {
        get { return mSelectedSchedule; }
        set
        {
            mSelectedSchedule = value;
            OnPropertyChanged("SelectedSchedule");
        }
    }

    public EmployeeWeekCheckButon_VM(Schedule GivenSchedule)
    {
        SelectedSchedule = GivenSchedule;
    }

    private void Edit()
    {
        Forms.Tracking.View.frmEditTracking newForm = new Forms.Tracking.View.frmEditTracking(SelectedSchedule);
        newForm.ShowDialog();
        OnPropertyChanged("SelectedSchedule");
    }

    private void Delete()
    {
        SelectedSchedule = null;
    }

Edit-Window-XAML:

<ComboBox ItemsSource="{Binding ListOfSchedule}" SelectedItem="{Binding SelectedSchedule}" x:Name="cmdSchedule" HorizontalAlignment="Left" FontSize="16" Margin="17,27,0,0" VerticalAlignment="Top" Width="120"/>

Edit-Window-ViewModel:

private Schedule _SelectedSchedule;

    public Schedule SelectedSchedule
    {
        get { return _SelectedSchedule; }
        set { _SelectedSchedule = value;
            OnPropertyChanged("SelectedSchedule"); }
    }

    private ObservableCollection<object> _ListOfSchedule;

    public ObservableCollection<object> ListOfSchedule
    {
        get { return _ListOfSchedule; }
        set { _ListOfSchedule = value;
            OnPropertyChanged("ListOfSchedule");
        }
    }

    public frmEditTracking_VM(Schedule GivenSchedule)
    {
        SelectedSchedule = GivenSchedule;
    }

    private void SaveAndClose()
    {
        SelectedSchedule.isTracked = true;
        OnClosingRequest();
    }
18.03.2018 - 12:21 Uhr

Ich verzweifel...

erstmal Danke Taipi88, es stimmt dass das Objekt ein Referenzobjekt ist und sich ein "ref" erübrigt.

also wie es scheint, wird das Objekt richtig von Window A zu Window B übergeben. In Window B kann ads SelectedObject auch bearbeitet werden und die neuen Informationen werden auch in Window A angezeigt.
Im Window B habe ich eine Combobox mit einer ListOfSelectedObject, die per SelectedItem als SelectedObject gebunden sind. Wenn ich nun aus der Liste ein anderes SelectedObject auswähle, wird das nicht übernommen, im Window A wird weiterin das ursprüngliche SelectedObject angezeigt.
Also wenn ich das SelectedObject bearbeite, Name, Id, oder sontiges, wird das korrekt übernommen, aber wenn ich dem SelectedObject ein neues Objekt zuweisen will, dann wird es ignorieret...

Was mache ich falsch???

15.03.2018 - 12:01 Uhr

Hi zusammen,

sicher ganz einfach, aber ich komm da gerade nicht weiter:

Ich habe ein UserControl sammt ViewModel. Dieses ViewModel besitzt die Property "SelectedObject". Von diesem ViewModel aus wird ein Window geöffnet, auch wieder mit ViewModel, in dem das "SelectedObject" bearbeitet wird (Eigeneschaften wie Name, ID, usw). Bis hier hin klappt es auch.
Nun möchte ich das geänderte Object wieder an das erste UserControl zurück geben, aber da steh ich auf dem Schlauch, wie bekomme ich das am besten hin?
Versucht hatte ich schon das SelectedObject als Referenz zu übergeben, allerdings meckert VS dass Eigenschaften nicht mit "ref" übergeben werden können.
Zweiter Gedankenansatz war das Window in dem das SelectedObject bearbeitet wird als Dialog zu entwerfen und das SelectedObject quasi als DialogResult zurück zu geben, aber auch da weiss ich nicht weiter.

Hof eich konnte die Problematik erklären und mir kann jemand helfen.

Danke Euch!

Chris

04.09.2017 - 18:25 Uhr

hab sie in beide Ordner kopiert, geht aber trotzdem nicht...

04.09.2017 - 17:03 Uhr

verwendetes Datenbanksystem: SQLite

Hi zusammen,
mein Programm startet ohne Probleme unter Visual Studio, sowohl Debug als auch Release. Wenn ich das Programm allerdings veröffentliche (lokal), das Setup ausführe und das Programm starte passiert nichts.
Nun hab eich mir das Eventlog von Windows angeschaut und folgendes gefunden:

zwei Fehlermeldungen direkt hintereinander...
1.:> Fehlermeldung:

Name der fehlerhaften Anwendung: Shifter.exe, Version: 1.0.0.0, Zeitstempel: 0x59ad66e0
Name des fehlerhaften Moduls: KERNELBASE.dll, Version: 10.0.15063.502, Zeitstempel: 0xc3955624
Ausnahmecode: 0xe0434352
Fehleroffset: 0x000eb802
ID des fehlerhaften Prozesses: 0x3b50
Startzeit der fehlerhaften Anwendung: 0x01d3258c695c6580
Pfad der fehlerhaften Anwendung: C:\Users\Chris\AppData\Local\Apps\2.0\LL6J546A.ZR7\NXQL8HHB.PEN\shif..tion_bdad0c0caa1c4edb_0001.0000_5f9c07af089a7625\Shifter.exe
Pfad des fehlerhaften Moduls: C:\WINDOWS\System32\KERNELBASE.dll
Berichtskennung: 6a57fec8-a7a4-47b0-bc4e-54ecd8b9ed7a
Vollständiger Name des fehlerhaften Pakets:
Anwendungs-ID, die relativ zum fehlerhaften Paket ist:

2.:> Fehlermeldung:

Anwendung: Shifter.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.DllNotFoundException
bei System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(System.Data.SQLite.SQLiteConfigOpsEnum)
bei System.Data.SQLite.SQLite3.StaticIsInitialized()
bei System.Data.SQLite.SQLiteLog.Initialize()
bei System.Data.SQLite.SQLiteConnection..ctor(System.String, Boolean)
bei System.Data.SQLite.SQLiteConnection..ctor()
bei Shifter.Database.Database_Rota..cctor()

Ausnahmeinformationen: System.TypeInitializationException
bei Shifter.Database.Database_Rota.LoadRota(Int32)
bei Shifty.Forms.Start..ctor()

Ausnahmeinformationen: System.Windows.Markup.XamlParseException
bei System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
bei System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
bei System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
bei System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
bei System.Windows.Application.LoadComponent(System.Uri, Boolean)
bei System.Windows.Application.DoStartup()
bei System.Windows.Application.<.ctor>b__1_0(System.Object)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
bei System.Windows.Threading.DispatcherOperation.InvokeImpl()
bei System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
bei System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
bei MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
bei System.Windows.Threading.DispatcherOperation.Invoke()
bei System.Windows.Threading.Dispatcher.ProcessQueue()
bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
bei MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
bei System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
bei System.Windows.Application.RunDispatcher(System.Object)
bei System.Windows.Application.RunInternal(System.Windows.Window)
bei System.Windows.Application.Run(System.Windows.Window)
bei Shifter.App.Main()

Das einzige was ich jetzt daraus lesen kann ist, dass es wohl ein Problem mit SQLite gibt, deswegen hier in diesem Forum... wer kann helfen?

Vielen Dank!
Kriz

02.09.2017 - 12:41 Uhr

Also muss dann die Klasse Vertrag auch von INotifyPropertychanged erben und die Benachrichtigung wird dann quasi weiter "nach oben" geleitet?

02.09.2017 - 12:11 Uhr

Hallo zusammen,

folgende Situiation:

ich habe eine Klasse Vertrag:

class Vertrag
    {
        private int mID;
        private string mName;

        public int ID
        {
            get { return mID; }
            set { mID = value; }
        }
        public string Name
        {
            get { return mName; }
            set { mName = value; }
        }
    }

diese habe ich als Property-ObservableCollection in einem VieModel:

private ObservableCollection<Vertrag> mVertragsListe;
        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<Vertrag> VertragsListe
        {
            get { return mVertragsListe; }
            set { mVertragsListe = value;
                OnPropertyChanged("VertragsListe");
            }
        }

        protected internal void OnPropertyChanged(string propertyname)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
        }

Das Problem: Wenn sich etwas an der ObservableCollection ändert, wird , wie erwartet, OnPropertyChanged ausgelöst und die View aktualisiert. Wenn sich allerdings etwas an einem Vertrag ändert, wie beispielsweise die ID oder der Name, dann wird OnPropertyChanged nicht ausgelöst.
Wie gehe ich es an, dass meine View auch dann aktualisiert wird?

VielenDank!
Kriz

22.08.2017 - 16:39 Uhr

@pinki
Perfekt, das war es. Ich bedanke mich recht herzlich!

22.08.2017 - 16:17 Uhr

@pinki
Also die Fehlermeldung sieht so aus:

System.Windows.Data Error: 40 : BindingExpression path error: 'AddCommand' property not found on 'object' ''ShifterButton' (Name='btnAdd')'. BindingExpression:Path=AddCommand; DataItem='ShifterButton' (Name='btnAdd'); target element is 'ShifterButton' (Name='btnAdd'); target property is 'ClickHereCommand' (type 'ICommand')

Ich würde jetzt aus dieser Fehlermeldung interpretieren, dass das Objekt "bntAdd" vom Typ "ShifterButton" keine Property "AddCommand" hat. Was ja, wie gesagt, klar ist, da diese Property in meinem ViewModel des eigentlichen Fensters ist, wo der Button benutzt werden soll...
Hast Du denn, als Du es ausprobiert hast, auch mit ViewModel gearbeitet?

@ThomasE.
Der Sinn dahinter ist, an ein Command eines UserControls binden zu können. Sicher, in dieser Situation kann ich auch einfach einen Style nehmen, mir gehts aber gerade darum zu verstehen warum es nicht geht, damit ich gewappnet bin, falls ich es mal brauche.
Nachdem ich deinen Tip gefolgt bin, wird mir folgendes angezeigt:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=self'. BindingExpression:Path=AddCommand; DataItem=null; target element is 'ShifterButton' (Name='btnAdd'); target property is 'ClickHereCommand' (type 'ICommand')
22.08.2017 - 09:04 Uhr

Mit Styles funktioniert das wunderbar, wollte es aber mal als UserControl versuchen da ich es fur später vllt mal gebrauchen kann, also das Wissen wie es geht...

21.08.2017 - 21:50 Uhr

Hi zusammen,

folgende Herausforderung: Ich habe in User Control die quasi nur ein Button mit anderer grafischer Darstellung ist, nun möchte ich an die Command-Property binden, steh allerdings auf dem Schlauch wie ich es am geschicktesten anstelle...
xaml:

<UserControl x:Class="Shifter.Common.ShifterButton"
             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:common="clr-namespace:Shifter.Common"
             mc:Ignorable="d" 
             d:DesignHeight="40" d:DesignWidth="40"
             DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <UserControl.Resources>
        <common:InverseBooleanConverter x:Key="InverseBooleanConverter"/>
        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="Button.Static.Background" Color="#FFC4F0FF"/>
        <SolidColorBrush x:Key="Button.Static.Border" Color="#FFC5C5C5"/>
        <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FF7AA5B3"/>
        <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
        <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
        <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
        <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
        <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
        <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
    </UserControl.Resources>
    <Button Name="button" 
            Click="button_Click" 
            Width="30" 
            Height="30"
            Cursor="Hand"
            Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Common:ShifterButton}}, Path=ClickHereCommand}">>
        <Button.Template>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Name="buttonBorder" Width="30" Height="30">                    
                    <StackPanel>
                        <Image Name="img" Source="{Binding NormalImage}" Stretch="Fill"/>
                    </StackPanel>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsDefaulted" Value="true">
                        <Setter Property="BorderBrush" TargetName="buttonBorder" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="buttonBorder" Property="Effect">
                            <Setter.Value>
                                <DropShadowEffect ShadowDepth="-1"/>
                            </Setter.Value>
                        </Setter>                        
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter TargetName="buttonBorder" Property="Effect">
                            <Setter.Value>
                                <BlurEffect Radius="5"/>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="Background" TargetName="buttonBorder" Value="{StaticResource Button.Disabled.Background}"/>
                        <Setter Property="BorderBrush" TargetName="buttonBorder" Value="{StaticResource Button.Disabled.Border}"/>
                        
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Template>
    </Button>
</UserControl>

Code Behind:

public partial class ShifterButton : UserControl
    {
        public event RoutedEventHandler Click;

        public ShifterButton()
        {
            InitializeComponent();
        }

         public ICommand ClickHereCommand
        {
            get { return (ICommand)GetValue(ClickHereCommandProperty); }
            set { SetValue(ClickHereCommandProperty, value); }
        }
        public static readonly DependencyProperty ClickHereCommandProperty =
            DependencyProperty.Register("ClickHereCommand", typeof(ICommand), typeof(ShifterButton), new UIPropertyMetadata(null));


        public ImageSource NormalImage
        {
            get { return (ImageSource)GetValue(NormalImageProperty); }
            set { SetValue(NormalImageProperty, value); }
        }
        public static readonly DependencyProperty NormalImageProperty = DependencyProperty.Register("NormalImage", typeof(ImageSource), typeof(ShifterButton), new UIPropertyMetadata(null));

        private void button_Click(object sender, RoutedEventArgs e)
        {
            if (Click != null)
            {
                Click(this, e);
            }
        }


    }

Zielfenster xaml:

<common:ShifterButton ClickHereCommand="{Binding AddCommand}" x:Name="btnAdd" NormalImage="pack://application:,,,/Art/add.png" Height="30" Width="30" Margin="230,0,0,165" />

Zielfenster ViewModel:

public ICommand AddCommand { get; set; }
AddCommand = new RelayCommand(o => AddEntry());

Im Fehlerfenster sagt er mir, dass das UserControl keine Property "AddCommand" hat, was ja auch richtig und logisch ist, da sie ja in meinem ViewModel des Zielfensters ist. Wie stell ich es also an, dass das Binding an der richtigen Stelle sucht?

Wie ich es auch anstelle, ich bekomme Fehlermeldungen... 8o

03.08.2017 - 13:35 Uhr

Anfangs hatte ich ein Problem mit den Comboboxen (siehe Anfang vom Thema), da wurde mir das mit der GetHashCode-Methode überschreiben auch vorgeschlagen. Das hat dann so gut funktioniert dass ich dachte ich mach das auch mit der Klasse employee damit das Problem gar nicht erst auftritt... habe nun mal testweise die überschriebene Methode auskommentiert und siehe da, es funktioniert trotzdem einwandfrei...
Also die Identifikation läuft nun über die Personalnummer, wie es auch sein sollte...

02.08.2017 - 19:44 Uhr

Ich habe nun der Klasse employee eine weitere Eigenschaft hinzugefügt, die als Wert für die GetHashCode Funktion dient, der Wert wird in der Datenbank gespeichert und ist ja somit für jedes Objekt, bzw für jeden Mitarbeiter immer der gleiche Wert, dieser kann nachträglich auch nicht mehr geändert werden. Ist das falsch?

01.08.2017 - 22:24 Uhr

Problem gefunden...

Es lag nicht direkt am Binding, sondern an meiner Klasse Employee. Dort hatte ich die GetHashCode Funktion überschrieben, damit das Binding mit der ListBox funktioniert. GetHashCode hat die Personalnummer wiedergegeben. Beim Binding mit der ListBox hat das gut funktioniert, aber wenn ich einen neuen Mitarbeiter erstellt habe, hat er eine automatische Personalnummer bekommen welche dann geändert wurde und das Binding somit nicht mehr funktionierte.

Dennoch hat mir dein ArtikelMrSparkle gut geholfen, vielen Dank!

Kriz

01.08.2017 - 17:42 Uhr

meine View:

<Window x:Class="Shifter.Forms.Employee.frmEditEmployee"
        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"
        mc:Ignorable="d"
        Title="frmEditEmployee" Height="350.141" Width="497.195" WindowStyle="None" ResizeMode="NoResize" Foreground="Blue" WindowStartupLocation="CenterScreen">        

    <Grid>    
        <ListBox x:Name="lstEmployee" IsEnabled="{Binding NoEditMode}" SelectedItem="{Binding MasterEmployee}" ItemsSource="{Binding Path=ListOfEmployees}" HorizontalAlignment="Left" Height="276" Margin="25,19,0,0" VerticalAlignment="Top" Width="217" />
        <TextBox x:Name="txtForename" Text="{Binding SelectedItem.Forname, ElementName=lstEmployee}" Margin="342,21,0,0" GotFocus="SelectText"/>
        <TextBox x:Name="txtLastname" Text="{Binding SelectedItem.Lastname, ElementName=lstEmployee}" Margin="342,47,0,0" GotFocus="SelectText"/>
        <TextBox x:Name="txtShowingname" Text="{Binding SelectedItem.Showingname, ElementName=lstEmployee}" Margin="342,74,0,0" GotFocus="SelectText"/>
        <TextBox x:Name="txtPersonelNumber" Text="{Binding SelectedItem.EmployeeID, ElementName=lstEmployee}" Margin="342,99,0,0" GotFocus="SelectText"/>
        <DatePicker x:Name="dtpBirthday" SelectedDate="{Binding SelectedItem.Birthday, ElementName=lstEmployee}" HorizontalAlignment="Left" Margin="342,125,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.256,0.417" SelectedDateFormat="Short"/>
        <TextBox x:Name="txtLoan" Text="{Binding SelectedItem.Loan, ElementName=lstEmployee}" Margin="342,151,0,0" TextWrapping="Wrap" GotFocus="SelectText"/>
        <TextBox x:Name="txtPhone" Text="{Binding SelectedItem.Telephone, ElementName=lstEmployee}" Margin="342,229,0,0" TextWrapping="Wrap" GotFocus="SelectText"/>
        <TextBox x:Name="txtEMail" Text="{Binding SelectedItem.EMail, ElementName=lstEmployee}" Margin="342,255,0,0" TextWrapping="Wrap" GotFocus="SelectText"/>
        <ComboBox x:Name="cmbContract" ItemsSource="{Binding ListOfContracts, Mode=TwoWay}" SelectedItem="{Binding SelectedItem.Contract, ElementName=lstEmployee, Mode=TwoWay}" HorizontalAlignment="Left" Margin="342,179,0,0" VerticalAlignment="Top" Width="130"/>
        <ComboBox x:Name="cmbGroup" ItemsSource="{Binding ListOfGroups, Mode=TwoWay}" SelectedItem="{Binding SelectedItem.Group, ElementName=lstEmployee, Mode=TwoWay}" HorizontalAlignment="Left" Margin="342,204,0,0" VerticalAlignment="Top" Width="130"/>
        <CheckBox x:Name="chkHide" Content="MA im Dienstplan ausblenden" IsChecked="{Binding SelectedItem.isHiding, ElementName=lstEmployee}" HorizontalAlignment="Left" Margin="259,280,0,0" VerticalAlignment="Top" ToolTip="Der Mitarbeiter wird nicht im Dienstplan angezeigt (beispielsweise wegen längerer Abwesenheit)" Width="211"/>            

        <Button x:Name="btnAdd" Content="Add" Command="{Binding Path=cmdAdd, Mode=TwoWay}" HorizontalAlignment="Left" Height="35" Margin="25,303,0,0" VerticalAlignment="Top" Width="35">
        </Button>
        <Button x:Name="btnEdit" Content="Edit" Command="{Binding Path=cmdEdit}" HorizontalAlignment="Left" Height="35" Margin="70,303,0,0" VerticalAlignment="Top" Width="35">
        </Button>
        <Button x:Name="btnDelete" Content="Delete" Command="{Binding Path=cmdDelete}" HorizontalAlignment="Left" Height="35" Margin="115,303,0,0" VerticalAlignment="Top" Width="35">
        </Button>
        <Button x:Name="btnCancel" Content="Cancel" Command="{Binding Path=cmdCancel}" HorizontalAlignment="Left" Height="35" Margin="391,303,0,0" VerticalAlignment="Top" Width="35">
        </Button>
        <Button x:Name="btnOK" Content="OK" Command="{Binding Path=cmdOK}" HorizontalAlignment="Left" Height="35" Margin="436,303,0,0" VerticalAlignment="Top" Width="35">
        </Button>
    </Grid>
</Window>

mein ViewModel:

namespace Models
{
    public class VM_EditEmployee : INotifyPropertyChanged
    {
        #region Propertys
        private ObservableCollection<Common.Employee> mListOfEmployees;
        private ObservableCollection<Common.EmployeeContract> mListOfContracts;
        private ObservableCollection<Common.EmployeeGroup> mListOfGroups;
        private Common.Employee mMasterEmployee;
        private bool isNew;
        private Employee.frmEditEmployee EmpoyeeView;

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<Common.Employee> ListOfEmployees
        {
            get
            {
                return mListOfEmployees;
            }

            set
            {
                mListOfEmployees = value;
                OnPropertyChanged("ListOfEmployees");
            }
        }
        public ObservableCollection<EmployeeContract> ListOfContracts
        {
            get
            {
                return mListOfContracts;
            }

            set
            {
                mListOfContracts = value;
                OnPropertyChanged("ListOfContracts");
            }
        }
        public ObservableCollection<EmployeeGroup> ListOfGroups
        {
            get
            {
                return mListOfGroups;
            }

            set
            {
                mListOfGroups = value;
                OnPropertyChanged("ListOfGroups");
            }
        }
        public Common.Employee MasterEmployee
        {
            get
            {
                return mMasterEmployee;
            }

            set
            {
                mMasterEmployee = value;
                OnPropertyChanged("MasterEmployee");
            }
        }


        public ICommand cmdAdd { get; set; }
        public ICommand cmdEdit { get; set; }
        public ICommand cmdDelete { get; set; }
        public ICommand cmdCancel { get; set; }
        public ICommand cmdOK { get; set; }

        #endregion

        public VM_EditEmployee(Employee.frmEditEmployee tmpView)
        {
            EmpoyeeView = tmpView;
            cmdAdd = new RelayCommand(o => AddEntry());
            cmdEdit = new RelayCommand(o => EditEntry());
            cmdDelete = new RelayCommand(o => DeleteEntry());
            cmdCancel = new RelayCommand(o => Cancel());
            cmdOK = new RelayCommand(o => SaveEntry());

            ListOfEmployees = Database_Employee.GetListOfEmployee();
            ListOfContracts = Database_Contract.GetListOfContract();
            ListOfGroups = Database_Group.GetListOfGroups();
        }

        protected internal void OnPropertyChanged(string propertyname)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
        }

        private void DeleteEntry()
        {
            if (MessageBox.Show("Sure you want to delete?", "Question", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                Database_Employee.DeleteEmployee(MasterEmployee);
                ListOfEmployees = Database_Employee.GetListOfEmployee();
            }
        }

        private void Cancel()
        {

        }

        private void AddEntry()
        {
            isNew = true;
            Common.Employee newEmployee = new Common.Employee()
            {
                Forname = "Max",
                Lastname = "Mustermann",
                Showingname = "Max",
                EmployeeID = 666,
                Birthday = new System.DateTime(1980, 5, 5),
                Loan = "9,50",
                Contract = Database_Contract.GetListOfContract()[0],
                Group = Database_Group.GetListOfGroups()[0],
                Telephone = "012456789",
                EMail = "chris@roedernet.de",
                isHiding = false
            };

            ListOfEmployees.Add(newEmployee);
            MasterEmployee = newEmployee;
        }

        private void EditEntry()
        {
            isNew = false;
        }

        private void SaveEntry()
        {
                if (isNew == true)
                {
                    Database_Employee.CreateEmployee(MasterEmployee);                    
                }
                else                    {
                    Database_Employee.EditEmployee(MasterEmployee);
                }
                
            }
            else // Wenn der EditMode nict aktiv ist
            {
                EmpoyeeView.Close();
            }


        }
    }
}

Der neue Mitarbeiter "newEmployee" wird erst der Auflistung "ListOfEmployees" hinzugefügt und dann der SelectedItem Eigenschaft.

Das Speichern läuft in einer separaten Klasse: Connection öffnen, Datensatz eintragen, Connection schliessen, fertig. Das Speichern funktioniert auch, nur dass eben danach zwar Mitarbeiter in der Listbox ausgewählt werden können, aber die Textboxen und alles andere nicht mehr aktualisieren.

Wenn ich nach dem Speichern auf den neu hinzugefügten Eintrag in der Liste klicke und danach auf einen anderen Eintrag kommt ein "System.ArgumentException: "Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt."" und das Programm hängt sich auf.

31.07.2017 - 22:50 Uhr

Erstmal vielen Dank für die tatkräftige Hilfe, nur hab ich jetzt wieder eine neue Problemstellung:
So wie von pinki vorgeschlagen habe ich in meinem ViewModel eine neue Eigenschaft (selectedEmployee) erstellt, die ich an die selectedItem Eigenschaft der ListBox gebunden habe, damit ich auf den ausgewähten Mitarbeiter der ListBox zugreifen kann.
Nun würde ich gern einen neuen Mitarbeiter erstellen, dies mache ich, indem ich eine neue Instanz mit verschiedenen Werten erstelle und diese Instanz dem selectedEmployee zuweise, da ich dachte dass somit ja das Binding direkt auf den neuen Mitarbeiter zeigt und somit alle Textboxen korrekt angezeigt werden. Funktioniert auch super.
Wenn ich dann aber nach dem Speichern (Also ein einfacher Datanbankeintrag) einen anderen Mitarbeiter in der Liste auswähle werden die Textboxen nicht mehr aktualisiert.
Vermutlich liegt es daran, dass ich in dem Moment wo ich dem selectedEmployee einen Wert, also den neuen Mitarbeiter zugewiesen habe, das Binding gelöscht wurde.

Ich habe versucht via Code das Binding wieder richtig zu setzten, das funktioniert aber nicht, da ich dafür im ViewModel auf das View zugreifen müsste und das widerspricht ja dem MVVM-Pattern.

Hat noch jemand eine andere Idee?

27.07.2017 - 21:28 Uhr

Moment, es hat sich ein neues "Problem" aufgetan...

Im ViewModel wird in einer Methode ein neuer Mitarbeiter erstellt, wie kann ich denn dann das Binding auf diesen neuen Mitarbeiter setzen?

27.07.2017 - 10:39 Uhr

@pinki: Super, funktionier, vielen Dank!

@Sir Rufo, danke für den Tip, funktioniert auch, vielen Dank!

Thema kann geschlossen werden.

27.07.2017 - 09:45 Uhr

Das habe ich gemacht damit ich den Mitarbeiter auch wieder speichern kann. Wie kann ich denn sonst auf den ausgewählten Mitarbeiter zurückgreifen?

27.07.2017 - 07:59 Uhr

Hi zusammen,

folgende Situation:

Ich habe zwei Klassen:


public class EmployeeContract
      {
             public string ContractName {get;set;}
             public Int ContractID {get;set;}
       }

public class Employee
      {
             public string Forname {get; set}
             public EmployeeContract Contract {get; set;}
       }

Die Mitarbeiter sind in einer Datenbank gespeichert und beim Einlesen wird der Contract anhand der ContractID (in der Datenbank mittels ForeignKey gesetzt) zugewiesen.

Dann habe ich meine View:

<ListBox x:Name="lstEmployee" ItemsSource="{Binding Path=ListOfEmployees}" HorizontalAlignment="Left" Height="276" Margin="25,19,0,0" VerticalAlignment="Top" Width="217" />
<TextBox x:Name="txtForename" Text="{Binding SelectedItem.Forname, ElementName=lstEmployee}" HorizontalAlignment="Left" Height="24" Margin="342,21,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="129" VerticalContentAlignment="Center" GotFocus="SelectText"/>
<ComboBox x:Name="cmbContract" ItemsSource="{Binding ListOfContracts, Mode=TwoWay}" SelectedItem="{Binding SelectedItem.Contract, ElementName=lstEmployee, Mode=TwoWay}" HorizontalAlignment="Left" Margin="342,179,0,0" VerticalAlignment="Top" Width="129"/>

Den DataContext setze ich in der CodeBehind mit

DataContext = new ViewModels.VM_EditEmployee(this);

Und das ViewModel sieht so aus:

public class Model_EditEmployee : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public ObservableCollection<Common.Employee> ListOfEmployees { get; set; }
        public ObservableCollection<Common.EmployeeContract> ListOfContracts { get; set; }
        public ObservableCollection<Common.EmployeeGroup> ListOfGroups { get; set; }

        public ICommand AddCommand { get; set; }
        private Forms.Employee.frmEditEmployee tmpView;

        public Model_EditEmployee(Forms.Employee.frmEditEmployee newView)
        {
            tmpView = newView;
            AddCommand = new RelayCommand(o => AddEntry());

            ListOfEmployees = Database.Database_Employee.GetListOfEmployee();
            ListOfContracts = Database.Database_Contract.GetListOfContract();
            ListOfGroups = Database.Database_Group.GetListOfGroups();
        }

        protected internal void OnPropertyChanged(string propertyname)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
        }

Nun zu meinem Problem:
Die lstEmployee wird korrekt mit den Mitarbeitern gefüllt, sowie die Auswahlmöglichkeiten der cmbContract. Wenn ich einen Mitarbeiter auswähle wird die txtForname auch brav richtig mit dem Vornamen gefüllt, aber die cmbContract bleibt leer. Also man kann zwar die verschiedenen Verträge auswählen, dennoch funktioniert das Binding da nicht.
Wenn ich nun direkt an die SelectedIndex-Property der cmbContract mit der ContractID binde funktioniert das nur solange die ContractID gleich dem Index ist, was nur selten so ist.
Wenn ich die Text-Property der cmbContract an die ContractName binde, dann wird beim auswählen zwar auch die cmbContract korrekt angezeigt, also mit dem richtigen Vertrag, aber das Speichern funktioniert dann wieder nicht, weil das über die ContractID gemacht wird und auch so bleiben soll.

Also: Ich möchte die SelectedItem-Property der cmbContract an die Contract-Property meines ausgewählen Employee binden. Was mache ich falsch?

Vielen Dank für die Hilfe!

26.01.2017 - 19:41 Uhr

public frmWeeklySchedule()
        {
            InitializeComponent();
            this.Height = Settings.GlobalSettings.ListOfEmployee.Count() * 30 + 140;
            foreach (var item in Settings.GlobalSettings.ListOfEmployee)
            {

                Common.EmployeeWeekview newEmployee = new Common.EmployeeWeekview()
                {
                    DataContext = item
                };
                
                RowDefinition rwdef = new RowDefinition();
                rwdef.Height = GridLength.Auto;
                
                EmployeeGrid.RowDefinitions.Add(rwdef);                
                EmployeeGrid.Children.Add(newEmployee);
                Grid.SetRow(newEmployee, count);
                count++;
                
                newEmployee.btnMonday.Click += SelectShift ;
            }
        }


private void SelectShift( object sender, EventArgs e)
        {
            frmSelectShift SelectShift = new frmSelectShift();
            SelectShift.ShowDialog();
        }

-> newEmployee.btnMonday.Click += SelectShift
Wenn ich an dieser Stelle versuche das item weiter zu geben mit ... += SelectShift(item) wird mir schon während dem Tippen angezeigt: "Der Typ "void" kann nicht implizit in "System.Windows.RoutedEventHandler" konvertiert werden."
Wie kann ich also an dieser Stelle ein Item bzw den DataContext weiter geben?

26.01.2017 - 09:03 Uhr

Guten Morgen,

folgendes Szenario:

Ich habe ein UserControl mit mehreren Buttons. Datacontext ist ein Objekt der Klasse "Person".

Während der Laufzeit werden in einer foreach-Schleife mehrere dieser Usercontrols erstellt, abhängig davon wie viele "Personen" in einer List<Person> sind.

Wenn nun einer der Buttons in der Usercontrol geklickt wird, soll ein weiteres Fenster geöffnet werden, das den Datacontext übergeben bekommt.

Im Moment bin ich soweit, dass in der foreach-Schleife mit Button.Click += NeueMethode eine Methode gestartet wird, mit der ich das neue Fenster samt Datacontext öffnen möchte, allerdings bekomme ich den Datacontext leider nicht weiter gegeben. Wenn ich Button.Click += NeueMethode(Person) versuche bekomme ich den Fehler dass void nicht in RoutedEventHandler konvertiert werden kann, also hab ich die Signatur meiner NeueMethode mit ( object sender, EventArgs e) angepasst, aber ich bekomme immer noch die Fehlermeldung...
Was muss ich tun???

Vielen Dank für Eure Hilfe!

Kriz

26.01.2017 - 08:33 Uhr

Guten Morgen zusamen!

Folgende Situation:

Ich habe zwei Forms, Form1 und Form2.
In Form1 habe ich mehrere Buttons, sagen wir Button1 bis Button10, alle zur Laufzeit aus einer List<T> erzeugt.
Wenn ich nun Button1 klicke, dann öffnet sich Form2.
In Form2 habe ich wieder mehrere Buttons, sagen wir ButtonA bis ButtonD, auch alle zur Laufzeit aus einer anderen List<T> erzeugt.
Dort klicke ich nun auf ButtonA, daraufhin schliesst sich das Fenster2 und der Content von Button1 soll den Content von ButtonA annehmen.

Wie bekomme ich also den Content von ButtonA in Form2 in den Button1 von Form1

Vielen Dank für Eure Hilfe!
Kriz

26.01.2017 - 07:29 Uhr

p!lle, vielen Dank, den Denkanstoss habe ich gebraucht!

Kriz

17.01.2017 - 09:28 Uhr

Ich habe ja den DataContext mit einer New Person zugewiesen (also DataContext = New Person()), wenn ich dann versuche meiner Liste den DataContext hinzuzufügen (mit ListePersonen.Add(DataContext) bekomme ich den Fehler dass DataContext ein Objekt ist und nicht in Person konvertiert werden kann...
Wie ist es sonst möglich?

17.01.2017 - 09:14 Uhr

Guten Morgen...

ich bin noch recht neu im Thema WPF und habe daher eine Frage...

Ich habe ein WPF Fenster, wessen Datacontext die Klasse Person hat. In diesem Fenster habe ich mehrere Textboxen welche mittels Binding an die verschiedenen Werte der Klasse Peron gebunden sind. Wenn ich nun dieses WPF Fenster erstelle mit einer vorhandenen Person werden die Werte (Name, Vorname, was auch immer) angezeigt. Wenn ich das Fenster mit einer New Person anzeige sind die Textfelder logischerwese leer. Wenn ich nun auf einen Button clicke, dann möchte ich, dass ein neues Objekt vom Typ Person, mit den eingetragenen Werten in den Textboxen, erstellt wird und einer List<Person> hinzugefügt wird.
Im Moment löse ich das mit

Person NeuePerson = new Person()
{
     Name = txtName.Text,
     Vorname = txtVorname.Text
}
ListePersonen.Add(NeuePerson);

Es funktioniert und erfüllt den Zweck, allerdings sollte es doch möglich sein, das Zuweisen der Werte vom DataContext bzw Binding übernehmen zu lassen...
Also, ist es möglich und wenn ja wie 😃

Vielen Dank für Eure Hilfe!!

Kriz