Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Kriz
Thema: Object von Window zu Window weiter geben
Am im Forum: GUI: WPF und XAML

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???

Thema: Object von Window zu Window weiter geben
Am im Forum: GUI: WPF und XAML

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

Thema: veröffentlichtes Programm startet nicht
Am im Forum: Datentechnologien

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

Thema: veröffentlichtes Programm startet nicht
Am im Forum: Datentechnologien

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.:

Fehler
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.:
Fehler
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

Thema: INotifyPropertyChanged "Eine Ebene tiefer"
Am im Forum: GUI: WPF und XAML

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

Thema: INotifyPropertyChanged "Eine Ebene tiefer"
Am im Forum: GUI: WPF und XAML

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

Thema: Wie binde ich ein Command an einen Button
Am im Forum: GUI: WPF und XAML

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

Thema: Wie binde ich ein Command an einen Button
Am im Forum: GUI: WPF und XAML

@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')

Thema: Wie binde ich ein Command an einen Button
Am im Forum: GUI: WPF und XAML

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...

Thema: Wie binde ich ein Command an einen Button
Am im Forum: GUI: WPF und XAML

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

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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...

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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?

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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.

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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?

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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?

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

@pinki: Super, funktionier, vielen Dank!

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

Thema kann geschlossen werden.

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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

Thema: SelectedItem-Property einer Combobox an die Property meines ausgewählen Objekts binden
Am im Forum: GUI: WPF und XAML

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!

Thema: Wie kann ich den Datacontext an EventHandler weiter geben
Am im Forum: Grundlagen von C#


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?

Thema: Wie kann ich den Datacontext an EventHandler weiter geben
Am im Forum: Grundlagen von C#

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

Thema: Variable aus einer anderen Form abfragen
Am im Forum: GUI: WPF und XAML

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

Thema: DataContext in ein neues Fenster übergeben und einer Liste hinzufügen
Am im Forum: GUI: WPF und XAML

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

Kriz

Thema: DataContext in ein neues Fenster übergeben und einer Liste hinzufügen
Am im Forum: GUI: WPF und XAML

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?

Thema: DataContext in ein neues Fenster übergeben und einer Liste hinzufügen
Am im Forum: GUI: WPF und XAML

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