Laden...

[gelöst]Combobox mit DataBinding ist nach dem Selektieren leer, Databinding funktioniert jedoch

Erstellt von t0rben vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.722 Views
T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 6 Jahren
[gelöst]Combobox mit DataBinding ist nach dem Selektieren leer, Databinding funktioniert jedoch

Guten Abend zusammen,

habe folgendes Phänomen:

Die Methode testgruppen() fügt testweise Gruppen ein um das Databinding zu testen.
Starte ich das Programm, sieht das Dropdownmenü zunächst leer aus.

Öffnet man es jedoch, sieht man, dass die Einträge dort vorhanden sind.
Sogar das SelectedItem ist vormarkiert.
Wähle ich einen beliebigen Eintrag aus, so schließt sich das Dropdownmenü wieder und die Anzeige zeigt wieder ein leeres Feld.

Da das Databinding augenscheinlich funktioniert, weiß ich hier nicht mehr weiter.

Danke schonmal im Voraus!

XAML

<ComboBox ItemsSource="{Binding GroupList}" DisplayMemberPath="id" SelectedItem="{Binding SelectedGroup, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="8" Width="200" HorizontalAlignment="Left"></ComboBox>

ViewModel


using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace navigatem_02
{
    public class FertigungsschrittViewModel : BaseViewModel
    {
        MainWindow wndMain = Application.Current.MainWindow as MainWindow;
        public String connectionString = "Data Source=DESKTOP-ORSNEPP\\SQLEXPRESS;Initial Catalog=navigatem;Persist Security Info=True;User ID=sa;Password=*****************";

        public ICommand saveCommand { get; set; }
        public ICommand refreshCommand { get; set; }
        public ICommand deleteCommand { get; set; }

        private String fertigungsschrittnummer;
        private String benennung;
        private String html;

        public string FertigungsSchrittNummer
        {
            get { return fertigungsschrittnummer; }
            set
            {
                if (value != fertigungsschrittnummer)
                {
                    fertigungsschrittnummer = value;
                    OnPropertyChanged("FertigungsSchrittNummer");
                }
            }
        }

        public string Benennung
        {
            get { return benennung; }
            set
            {
                if (value != benennung)
                {
                    benennung= value;
                    OnPropertyChanged("Benennung");
                }
            }
        }

        public string Html
        {
            get { return html; }
            set
            {
                if (value != html)
                {
                    html = value;
                    OnPropertyChanged("Html");
                }
            }
        }

        ObservableCollection<EmployeeGroup> m_lstGroups = new ObservableCollection<EmployeeGroup>();
        public ObservableCollection<EmployeeGroup> GroupList
        {
            get { return m_lstGroups; }
        }

        private EmployeeGroup selectedGroup;
        public EmployeeGroup SelectedGroup
        {
            get { return selectedGroup; }
            set
            {
                if (value != selectedGroup)
                {
                    selectedGroup = value;
                    OnPropertyChanged("SelectedGroup");
                }
            }
        }

        //Konstruktor 0
        public FertigungsschrittViewModel()
        {
            String id = "test";

            testgruppen();

        }

        //Konstruktor 1
        public FertigungsschrittViewModel(String id)
        {

        }

        //Methoden

        public void testgruppen()
        {
            EmployeeGroup a = new EmployeeGroup("4", "blabla");
            SelectedGroup = a;
            m_lstGroups.Add(new EmployeeGroup("1", "testname"));
            m_lstGroups.Add(SelectedGroup);
            m_lstGroups.Add(new EmployeeGroup("2", "testname2"));
        }
    }

       /* public void save()
        {
            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("UPDATE Fertigungsschritt");
            sb.AppendLine("SET benennung = @Benennung, vk_preis=@VkPreis, verrechnungs_preis=@VrPreis, produktionszeit_soll=@Produktionszeit");
            sb.AppendLine("WHERE id_artikel=@Artikelnummer");
            using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
            {
                cmd.Parameters.AddWithValue("Benennung", Benennung);
                cmd.Parameters.AddWithValue("VkPreis", VkPreis);
                cmd.Parameters.AddWithValue("VrPreis", VrPreis);
                cmd.Parameters.AddWithValue("Produktionszeit", Produktionszeit);
                cmd.Parameters.AddWithValue("Artikelnummer", ArtikelNummer);
                cmd.ExecuteNonQuery();

            }
            conn.Close();
        }*/

    }


T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 6 Jahren

Habe zum "debuggen" mal geprüft ob die set- & get-Methoden von SelectedGroup ausgeführt werden.

Beim Ändern wird zunächst die set-Methode und anschließend die get-Methode aufgerufen.
Die jeweiligen IDs stimmen überein.

Vielleicht hilft das ja weiter, um bestimmte Fehler auszuschließen..

private EmployeeGroup selectedGroup;
        public EmployeeGroup SelectedGroup
        {
            get {
                MessageBox.Show("get wird ausgeführt " + selectedGroup.id);
                return selectedGroup;
            }
            set
            {
                if (value != selectedGroup)
                {
                    selectedGroup = value;
                    OnPropertyChanged("SelectedGroup");
                    MessageBox.Show("set wird ausgeführt " + selectedGroup.id);
                }
            }
        }

Freundliche Grüße
Torben

D
985 Beiträge seit 2014
vor 6 Jahren

Welche .net FW hast du installiert?

Hier, mit .net 4.7 installiert, kann ich das nicht nachvollziehen

T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 6 Jahren

Hallo Sir Rufo,

danke für deine Antwort!

Habe auf dieser Seite geschaut wie ich die Version bestimme.
Laut dem Hinweis

Wenn der Full-Unterschlüssel nicht vorhanden ist, ist .NET Framework 4.5 oder höher nicht installiert. habe ich also ein niedrigeres .Net Framework.

Jedoch kann ich den Setup dazu auch nicht ausführen, siehe Anhang.

Bevor ich mich dazu sehr hinein renne, meinst du, dass es mit der .NET Version zu tun haben könnte?

Gruß
Torben

D
985 Beiträge seit 2014
vor 6 Jahren

Das kann ich so nicht sagen, aber man muss auch ausschließen, dass wir nicht Birnen und Äpfel vergleichen.

.net 4.7 aktualisiert auch .net 4.5.x und .net 4.6.x

Mit welchem VS arbeitest du und welches .net FW ist für die Anwendung festgelegt?

T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 6 Jahren

Hallo Sir Rufo,

Visual Studio 2015
.NET Framework 4.7.02046

Habe sonstige Informationen in der Quote eingefügt.

Microsoft Visual Studio Community 2015
Version 14.0.25431.01 Update 3
Microsoft .NET Framework
Version 4.7.02046

Installierte Version: Community

Microsoft Visual Studio Tools for Applications 2015 00322-20000-00000-AA801
Microsoft Visual Studio Tools for Applications 2015

Visual Basic 2015 00322-20000-00000-AA801
Microsoft Visual Basic 2015

Visual C# 2015 00322-20000-00000-AA801
Microsoft Visual C# 2015

Visual C++ 2015 00322-20000-00000-AA801
Microsoft Visual C++ 2015

Allgemeine Azure-Tools 1.8
Bietet allgemeine Dienste für die Verwendung durch Azure Mobile Services und Microsoft Azure-Tools.

Application Insights-Tools für Visual Studio-Paket 7.18.00214.2
Application Insights-Tools für Visual Studio

ASP.NET und Webtools 2015.1 (Beta8) 14.1.11107.0
ASP.NET und Webtools 2015.1 (Beta8)

ASP.NET Web Frameworks and Tools 2012.2 4.1.41102.0
For additional information, visit
>

ASP.NET Web Frameworks and Tools 2013 5.2.40314.0
For additional information, visit
>

JavaScript-Sprachdienst 2.0
JavaScript-Sprachdienst

JavaScript Project System 2.0
JavaScript Project System

Microsoft Azure Mobile Services Tools 1.4
Microsoft Azure Mobile Services Tools

NuGet-Paket-Manager 3.4.4
NuGet-Paket-Manager in Visual Studio. Weitere Informationen zu NuGet finden Sie unter "http://docs.nuget.org/".

PreEmptive Analytics Visualizer 1.2
Microsoft Visual Studio-Erweiterung zur Visualisierung aggregierter Zusammenfassungen vom PreEmptive Analytics-Produkt.

SQL Server Data Tools 14.0.60519.0
Microsoft SQL Server Data Tools

TypeScript 1.8.36.0
TypeScript-Tools für Visual Studio

Habe parallel auch mal eine Combobox ohne Databinding und ein Label mit Databinding eingefügt.
XAML

<ComboBox Name="test" Grid.Column="1" Grid.Row="9">
            <ComboBoxItem>test</ComboBoxItem>
            <ComboBoxItem>test2</ComboBoxItem>
        </ComboBox>
<Label Grid.Column="3" Grid.Row="8" Content="{Binding SelectedGroup.name}" VerticalAlignment="Center"></Label>

Die Combobox wird korrekt angezeigt.
Auch das Label zeigt den Namen des ausgewählten Objekts an.

Ich habe das Gefühl, dass die Combobox im "geschlossenen" Zustand versucht, das Objekt selbst darzustellen, was natürlich nicht klappt. Jedoch sind alle Beispiele, die ich finde, so wie mein XAML Code aufgebaut.

Danke schon mal für deine Hilfe!

Gruß
Torben

T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 6 Jahren

Werde zunächst mit folgender Lösung leben.

Habe folgende Eigenschaften ergänzt. Jetzt funktioniert das ganze so, wie ich es mir vorstelle 😃

IsEditable="True" IsReadOnly="True"

Die gesamte Combobox sieht nun so aus:

<ComboBox ItemsSource="{Binding GroupList}" DisplayMemberPath="anzeige" SelectedItem="{Binding SelectedGroup, Mode=TwoWay}" IsEditable="True" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="8" Width="200" HorizontalAlignment="Left"></ComboBox>
        
1.040 Beiträge seit 2007
vor 6 Jahren

Also bei mir funktioniert es auch ohne diese Anpassungen.

Kannst du mal deine EmployeeGroup-Klasse zeigen und evtl. das Projekt (in abgespeckter Version) zur Verfügung stellen?

T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 6 Jahren
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace navigatem_02
{
    /// <summary>
    /// Interaktionslogik für EmployeeGroup.xaml
    /// </summary>
    public partial class EmployeeGroup : UserControl
    {
        public String id { get; set; }
        public String name { get; set; }
        public String anzeige { get; set; }
        
        public EmployeeGroup()
        {
            InitializeComponent();
            this.DataContext = new EmployeeGroupTabViewModel();
        }

        public EmployeeGroup(String id)
        {
            InitializeComponent();
            this.DataContext = new EmployeeGroupTabViewModel(id);
        }

        public EmployeeGroup(String id_in, String name_in)
        {
            id = id_in;
            name = name_in;
            anzeige = id + " " + name;
        }

    }
}

Könnte es daran liegen, dass ich aus EmployeeGroup ein ViewModel erzeuge, welches wiederum eine EmployeeGroup erzeugt, welches wieder ein ViewModel erzeugt? Employeegroup ist bei mir ein Usercontrol..

So ganz sauber scheint mir das nicht. Ich werde mal schauen, dass ich die testweise die Klasse Mitarbeitergruppe einführe.

P.S.: Meine derzeizige Lösung funktioniert leider doch nicht zuverlässig..

/edit/

public class mitarbeitergruppe
    {
        public string gruppennr { get; set; }
        public string gruppenname { get; set; }
        public string gruppenbeschreibung { get; set; }
        public mitarbeitergruppe(String nr, String name)
        {
            gruppennr = nr;
            gruppenname = name;
        }
        public mitarbeitergruppe() { }

    }

Kaum macht man's richtig, schon funktioniert es auch ohne IsEditable.

Sorry, da hab ich euch (und mich) auf eine ganz schön falsche Fährte gelockt.

Gruß
Torben

1.040 Beiträge seit 2007
vor 6 Jahren

Na siehst du, geht doch. 👍

Noch als Tipp:
[Artikel] C#: Richtlinien für die Namensvergabe =)