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();
}*/
}
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
Welche .net FW hast du installiert?
Hier, mit .net 4.7 installiert, kann ich das nicht nachvollziehen
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
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?
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.02046Installierte Version: Community
Microsoft Visual Studio Tools for Applications 2015 00322-20000-00000-AA801
Microsoft Visual Studio Tools for Applications 2015Visual Basic 2015 00322-20000-00000-AA801
Microsoft Visual Basic 2015Visual C# 2015 00322-20000-00000-AA801
Microsoft Visual C# 2015Visual C++ 2015 00322-20000-00000-AA801
Microsoft Visual C++ 2015Allgemeine 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 StudioASP.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-SprachdienstJavaScript Project System 2.0
JavaScript Project SystemMicrosoft Azure Mobile Services Tools 1.4
Microsoft Azure Mobile Services ToolsNuGet-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 ToolsTypeScript 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
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>
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?
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