ich versuche gerade eine ObservableCollection an ein RadGridView (Telerik) zu binden.
Wenn ich das SelectedItem ebenfalls an mein MVVM binde und dort Änderungen tätige, werden diese zwar in die Datenquelle übernommen, allerdings aktualisiert sich mein RadGridView nicht?
Kann mir jemand vielleicht helfen wo mein Fehler aktuell ist :
ViewModel
public System.Collections.ObjectModel.ObservableCollection<View_Extraroehrchen> Extraröhrchen { get { return _Extraröhrchen; } set { _Extraröhrchen = value; OnPropertyChanged("Extraröhrchen"); } }
protected virtual void OnPropertyChanged(string PropertyName)
{
PropertyChanged.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(PropertyName));
}
Die Daten werden offensichtlich korrekt übernommen, allerdings wird im RadGridView die Änderung erst angezeigt sobald ich in das Feld klicke und wieder ein anderes auswähle.
Jup lag am struct, wusste ich nicht das es damit nicht geht, hab mir jetzt eine Klasse genommen damit funktioniert es.
Ich kann die Static Sachen nicht alle rauswerfen, das wäre aktuell einfach zu viel Aufwand, das muss ich nach und nach mal aufarbeiten.
Weil ich hier zuletzt schrieb das es am struct lag warum es mit der ObservableCollection nicht funktioniert hat und es mittlerweile funktioniert, des halb ist es Blödsinn.
Außerdem ist es jawohl Geschmackssache ob man Daten eher in einer Liste als einer DataTable verarbeitet.
deinen letzten Kommentar verstehe ich nicht. Du hast doch gefragt, weil es nicht so funktioniert, wie es derzeit implementiert ist.
leider totaler Blödsinn ^^. Ich habe gefragt ob es so wie es aktuell implementiert es, die Möglichkeit besteht das ganze umzusetzen, was auch funktioniert, ich habe ja bereits den Lösungsquellcode gepostet.
Das Programm und auch die funktionsweise die ich mit dem aktuellen Stand umsetzen wollte funktioniert. Der Code ist funktionsfähig, ebenfalls testbar und auch lesbar, er mag zwar nicht so sein wie es sich gehört und das er neu geschrieben werden müsste, das möchte ich gar nicht abstreiten, aber ich hatte bereits geschrieben ich kann es nicht ändern.
Und um diesen Kommentar dir zu erklären -> Ich bin wie gesagt neu in der Firma, das Programm ist nicht klein, ich kann nicht einfach alles neu schreiben, das wäre ewig dauern .. ich muss nun mal damit erstmal arbeiten und das nach und nach anfassen.
Trotzdem danke für die Links, ich kenne allerdings das normale MVVM vorgehen, ich hätte auch nicht alles static deklariert bzw. hab ich das zuvor noch nie benutzt.
Ich müsste jetzt tatsächlich lange nachdenken um mich zu erinnern, wann ich das letzte mal structs benutzt habe.
Ich kann mich wie unconnected nicht daran erinnern, wann ich das letzte mal bewusst strucs verwendet habe und static dazu (Consolen Main Methoden (static) und Datetimes (struct) ausgenommen ;)
Geht mir ähnlich static in dem Zusammenhang hab ich so auch nie benutzt, deswegen ist das ganze auch ein wenig umständlich gerade für mich. Struct war meine Idee, hatte das irgendwie im Hinterkopf und dachte, wozu gibts das Zeug, wenn ich es dafür nicht nutze, wusste aber nicht das es einfach überholt ist.
Kleiner, allgemeiner Tipp:
In den meisten Fällen ist ein OnPropertyChanged bei einer Property vom Typ "ObservableCollection" nicht notwendig. Es sei denn, die komplette Property wird neu gesetzt.
Das Hinzufügen oder Löschen von Einträgen in der OC wird bereits durch die OC selbst überwacht.
Gilt allerdings nicht für static, habs gerade nochmal probiert, aber ansonsten danke für die Info :P
War mir aber zur ObservableCollection auch schon bekannt.
Ich persönlich kann damit auch nichts anfangen, würde so auch nicht schreiben, allerdings weiß ich auch nicht warum man das nicht machen sollte, also die Begründung .. ihr seid doch dort mehr bewandert, kann mich eventuell jemand aufklären?
Also es scheint zu funktionieren nur hat es mit Listen leider nicht funktioniert.
Hab jetzt mal eine DataTable benutzt und damit ging es dann, eigentlich wollte ich keine DataTable benutzen, weil ich mir dann immer erst meinen Eintrag suchen muss, jemand eine bessere Idee, welchen Typen ich verwenden könnte?
private static System.Data.DataTable _DataTable;
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
public static System.Data.DataTable DataTable
{
get { return _DataTable; }
set { _DataTable = value;
NotifyStaticPropertyChanged("DataTable");
}
}
private static void NotifyStaticPropertyChanged(string PropertyName)
{
if (StaticPropertyChanged != null)
{
StaticPropertyChanged(null, new PropertyChangedEventArgs(PropertyName));
}
}
ich hab vor kurzem die Firma gewechselt und das Projekt was mir neu zugewiesen wurde, dort wurden fast nur static Propertys verwendet, meine Frage .. ist es möglich das ganze auch mit static Propertys auf PropertyChanged umzusetzen? Bevor ich alles umschreiben müsste?
Zuletzt hatte ich das Beispiel erfolgslos versucht :
static DataHerstellung()
{
PropertyChanged += (sender, e) => { return; };
}
#region Definitionen
//public static event PropertyChangedEventHandler PropertyChanged;
public static event EventHandler PropertyChanged;
private static int _List_Of_Validation_SelectedIndex;
private static System.Collections.ObjectModel.ObservableCollection<List_Of_Validation> _ValidationEntrys;
#endregion
#region Struktur
public struct List_Of_Validation
{
public string Message { get; set; }
public bool Message_IsChecked { get; set; }
public string Info { get; set; }
public string Typ { get; set; }
}
#endregion
public static System.Collections.ObjectModel.ObservableCollection<List_Of_Validation> ValidationEntrys
{
get
{
return _ValidationEntrys;
}
set
{
_ValidationEntrys = value;
OnPropertyChanged(EventArgs.Empty);
}
}
gibt es ein Steuerelement in WPF (auch Telerik) wo ich mir mein Datum auswählen kann und meine Uhrzeit via Uhr oder ähnlichem?
Hab für Telerik jetzt nur RadDateTimePicker gefunden, aber dort kann ich nur ein Intervall für die Uhrzeitauswahl angeben, müsste mir dann diese Uhrzeit auswählen und manuell im Feld nochmal nachpflegen.
Konnte jemand schon mal in die Richtung Erfahrung sammeln?
Sorry meinte auch EF6, ich frag nur, weil das ganze via Direkt SQL zu machen irgendwie veraltet zu sein scheint. Jedenfalls wird es in meiner neuen Firma nicht praktiziert.
Wie ich das ganze in C# umsetzen kann, weil wenn ich das ganze ähniche versuche, scheitert es schon bei dieser CDATA Anweisung, da mir diese fehlerhaft angezeigt wird, würde mich trotzdem interessieren wie das geht, auch wenn man es offensichtlich anders umsetzen soll, was auch gut zu wissen ist.
Soll ich mich jetzt einem der Beispiele von gfoidl witmen, oder habt ihr noch einen Vorschlag? Ich les ja jetzt nur das meine "alte" Vorgehensweise unsicher und schlecht ist? Wobei ich damit immer gut gefahren bin und aktuell auch nicht direkt weiß warum die unsicher sein sollte. Wenn es jetzt um Hochkommas oder dergleichen geht ist das absolut kein Ausschlusskriterium in meinen Augen.
Doch das hat wunderbar funktioniert, fand das auch sehr übersichtlich.
Dim sqlCommandString As String = <![CDATA[
SELECT
AI.ViewCluster,
AI.Artikelnummer, A.Matchcode,
AI.Kanal AS Vertriebskanal,
ISNULL(AI.IsGrouped, 0) AS IsGrouped,
MGGFK.Sku_Gruppe AS GrpSKU,
CAST(AI.AngelegtAm AS DATE) AS AngelegtAm
FROM Artikelstammdaten.dbo.ArtikelImport AS AI
LEFT JOIN SL_MMETA.dbo.ART AS A
ON AI.Artikelnummer = A.Artikelnummer
LEFT JOIN Artikelstammdaten.dbo.MT_get_gruppiertXeinfach_from_Kanal(']]><%= Vertriebskanal %><![CDATA[') AS MGGFK
ON AI.Artikelnummer = MGGFK.Sku_Einfach COLLATE Latin1_General_CI_AS
WHERE Kanal = ']]><%= Vertriebskanal %><![CDATA['
ORDER BY ViewCluster, IsGrouped, Artikelnummer
]]>
Zitat von p!lle
Und selbst wenn du den unsauberen Weg gehst und reines SQL absetzen willst, haben das <a> und das <![CDATA[ ... ]]> da nichts zu suchen. Das soll in VB funktioniert haben? :baby:
ich habe das Problem das wenn ich meine TextBox mit meinem VM verbinde und im PropertyChanged Event dann auf jede Eingabe reagiere (Möchte den Wert mit der Datenbank überprüfen) es zu sichtlichen performance Problemem kommt für den Benutzer, hat jemand schon mal Erfahrung gesammelt?
Man könnte es auch anders lösen, allerdings interessiert mich erstmal ob man in dem Fall irgendetwas machen kann?
Public Sub set_VerticalOffset_From_ScrollViewer(ByVal VerticalOffset As Double)
' --- interne Variablen Deklaration --- '
Dim iCount As Integer = 0
Try
If Not VisualTreeHelper.GetChildrenCount(DataGrid) = 0 Then
Do While iCount < VisualTreeHelper.GetChildrenCount(DataGrid)
If TypeOf (VisualTreeHelper.GetChild(DataGrid, iCount)) Is Border Then
Dim Border As Border = VisualTreeHelper.GetChild(DataGrid, iCount)
If Not VisualTreeHelper.GetChildrenCount(Border) = 0 Then
If TypeOf (VisualTreeHelper.GetChild(Border, iCount)) Is ScrollViewer Then
Dim ScrollViewer As ScrollViewer = VisualTreeHelper.GetChild(Border, iCount)
If ScrollViewer IsNot Nothing Then
ScrollViewer.ScrollToVerticalOffset(VerticalOffset)
End If
End If
End If
End If
iCount = iCount + 1
Loop
End If
Catch ex As Exception
Fehlerbehandlung = New Fehlerbehandlung
Fehlerbehandlung.Fehlermeldung = ex
Fehlerbehandlung.ShowDialog()
End Try
End Sub
ich hab ein DataGrid in einem Frame und möchte mir von dem DataGrid den ScrollViewer holen um den Wert des ScrollToVerticalOffset zu setzen.
Leider bekomm ich schon von der Funktion VistualTreeHelper.GetChildrenCount(DataGrid) eine 0 zurück, wenn ich das ganze außerhalb des Frames mit dem selben DataGrid ausführe bekomm ich einen Wert zurück.
Funktioniert so etwas grundsätzlich nicht wenn man eine Page in ein Frame geladen hat?
Kommt der Fehler ständig, wenn ich das ganze auf IE=8 stelle funktioniert es.. allerdings sieht es dann nicht mehr so aus wie gewünscht .. es ist zum verzweifeln.