Danke für die Hilfe - nun klappts anscheinend.
Habe jetzt für die Library je eine Projektdatei für WP7 und eine für WPF (mit unterschiedlichen Referenzen auf die jeweiligen Standard-Assemblies) jedoch die CodeFiles nur einmalig (beim Hinzufügen eines File muss ich dann wohl das andere Projektfile entsprechend ergänzen).
Zumindest für die ObservableCollection kompiliert es fehlerfrei und läuft auch wie erwartet.
Ich möchte eine Windows Phone 7 App schreiben und parallel dazu eine WPF-Anwendung.
Nach altbewährtem Vorgehen wollte ich hierzu eine Test.Lib-Library erstellen in dem die ViewModels bzw. BusinessModels drinstecken und dann diese Library in der WP7- sowie WPF-App einbinden und auf dieses Objekte Databinding machen - sollte im Prinzip ja kein Problem sein.
Nur ist es halt so, dass ich in der Test.Lib-Library eine ObservableCollection<T> verwenden möchte.
Und nun das Problem: die beiden Apps verwenden unterschiedliche Assemblies in denen diese Klasse definiert ist (WPF: WindowsBase / WP7: System.Windows) was beim Kompilieren zu einem Fehler führt (in der WPF-App):
The type 'System.Collections.ObjectModel.ObservableCollection`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'. <mypath>\WpfTestApp\MainWindow.xaml.cs 34 13 WpfTestApp
Wie kann ich nun die Library auf einen gemeinsamen Nenner bringen ohne für jedes der 2 Applikationen separate ViewModels (inklusive ObserableCollection) erstellen zu müssen?
LG
Edit:
Habe gerade gesehen, dass beim Kompilieren noch ein Warning kommt: Warning 3 The project 'TestApp.Lib' cannot be referenced. The referenced project is targeted to a different framework family (Silverlight)
Also wird das was ich vorhabe wohl gar nichts funktionieren oder wie darf ich das verstehen? Wäre ja sehr schade und irgendwie unsinnig.
Habe mich gerade etwas damit auseinandergesetzt und bin zur Erkenntnis gelangt, dass es mit dem VirtualizingStackPanel (welches von der ListView standardmäßig verwendet wird) zu tun hat: Dabei werden die Container nämlich nicht sofort sondern erst bei Bedarf erzeugt und führt daher gelegentlich zu den Null-Referenzen bei GetContainerFrom...()-Aufrufen.
Du müsstest auf StatusChanged vom ContainerGenerator reagieren und wenn dieser fertig ist, kannst du die GetContainer-Methoden aufrufen sowie dann BringIntoView().
Da ist ganz einfach: Eine Zuweisung hat als "Ergebnis" immer den Wert und Typ, welcher zugewiesen wurde.
SqlCeParameter[] param = new SqlCeParameter[] { new SqlCeParameter("@user_Name", SqlDbType.NVarChar).Value = stringArr[0] };
Hier machst du eine String-Zuweisung, was als "Ergebnis" eben einen String liefert. Und String is nicht konvertiertbar in SqlCeParameter.
Du solltest die Value-Zuweisung also bereits vorher machen.
Platzhalter in SQL-Queries sind schlecht (Sql-Injection und so)
schon klar, aber so wie ich es verstanden habe, werden die Tabellen-Namen ja nicht vom Benutzer eingeben, sondern aus einer hardcodierten Werteliste entnommen. Von daher ist SQL Injection nicht das Problem.
Das mit dem Platzhalter vs. {0}, {1}:
Wäre eigentlich so gemeint, dass er ja ein Dictionary<string, string> für Programm-interne-Bezeichnung / wirklicher SQL-Tabellenname verwenden könnte. Da klappts halt dann doch nicht mit {0}. Aber ansonsten ist die {0}-Variante besser, da muss ich dir recht geben.
Vielleicht hilft es dir ja schon, wenn du einen Platzhalter (z.B. "%%USER_T%%") in deinen SQL-Strings verwendest und diesen dann durch den richtigen Tabellennamen ersetzt:
string USERS_T = "Users";
...
string sql = "select a, b, c from %%USERS_T%% where a = ...";
sql = sql.Replace("%%USERS_T%%", USERS_T);
Das ganze noch in ein Dictionary verpackt und schon gehts für verschieden Tabellen.
Dass das Logo einem N ähnelt, stimmt schon, nur war es IIRC eine Aussage von MS, dass es eine Welle symbolisieren soll - und da frage ich mich halt schon, was .NET bitte mit einer Welle zu tun haben soll?
Zitat vom verlinkten Blog:
Zitat
The result is a design we refer to as the “wave.” The design is strong, simple and distinctive. The suggestion of the letter ‘N’ in the design will become instantly recognizable over time as shorthand for the .NET brand name.
Ein Konstruktor von DirectoryEntry nimmt als Parameter Benutzername und Passwort. Vielleicht genügt es zu versuchen so ein DirectoryEntry-Objekt zu erstellen.
Das liegt daran, dass der GradientBrush bei z.B. x=101, das Rechteck aber bei x=100 steht. Also einfach beim Erzeugen des GradientBrushes bei der x-Koordinate 1 dazuzählen.
Ich würde nur eine Tabelle erstellen und eine Spalte "GültigAb" hinzufügen. Damit kannst du gezielt nach einer Version zu einem bestimmten Datum abfragen.
Natürlich muss du halt dann bei allen Select die "GültigAb"-Spalte berücksichtigen (gültig ist die, die am nähesten zum aktuellen Datum ist).
Die restlichen Datensätze kannst du dann auch unverändert lassen.
Zu deiner 2. Variante: Hier müsstest du jedesmal ein delete bzw. update der Tabelle mit den aktuellen Versionen machen und zusätzlich noch ein Insert in der Archiv-Tabelle. Würde ich nicht empfehlen, da du dann sehr aufpassen musst.
Doch, es gibt eine einzige Vorlesung/Übung in der mit C# gearbeitet wird: "Einführung in die Informatik" aus dem Elektrotechnik-Studium. Ein Bekannter von mir hat das gehabt ... aber selbst mach ich auch Softwareentwicklung Wirtschaft
Du könntest die eigentliche Methode aus der Basis-Klasse implementieren und eine zusätzliche (protected) Methode anbieten, die überschrieben werden kann. Und diese rufst du halt dann aus der eigentlichen Methode auf.
public class FooClass
{
public FooClass()
{
}
public void TestMethod()
{
MessageBox.Show("FooClass");
InternalTestMethod();
}
virtual protected void InternalTestMethod() {};
}
public class DummyClass : FooClass
{
public FooClass() : base()
{
}
override protected void InternalTestMethod()
{
MessageBox.Show("DummyClass");
}
}
Wenn du willst, dass die aufgerufene Method dein Objekt nicht ändern kann, musst du entweder eine Kopie oder eine ReadOnly-Variante vom Objekt übergeben (siehe dazu: Durch Get-Accessor schreiben?).
Ein Schlüsselwort wirds kaum geben, da dies bei Objekten nicht so trivial ist wie bei Wertetypen.
Ich denke es geht serial eher darum, dass man das, durch das Get-Property erhaltene, Objekt verändern kann, auch wenn es nicht "ge-set-tet" werden kann.
@Serial: Durch ein Property ohne Set-Accessor ist lediglich der Verweis zum Objekt schreibgeschützt, nicht aber das (Ziel-)Objekt selbst (!).
Original von Seikilos
Wenn n kleiner der Sektor größe ist, sind das die 8 umliegenden Sektoren, ...
Nicht unbedingt: Wenn nämlich der Kreis-Mittelpunkt ziemlich weiter links unten in einem Quadrat ist, dann können es auch weniger sein (z.B. für n = 0.75*Sektorgröße).
Eine Lösung hab ich zwar leider nicht, aber vl. hilft dir ja folgende Überlegung weiter:
- Wenn n zwischen e1 (Strecke zwischen Kreismittelpunkt und Eckpunkt der am wenigsten weiter vom Kreismittelpunkt entfernt ist) und e1 (Strecke zwischen Kreismittelpunkt und Eckpunkt der am weitesten vom Kreismittelpunkt entfernt ist) ist, dann ist der Kreis im Sektor, ansonsten nicht
- Optimierung: z.B. Im linken-oberen-Viertel ist der linke-obere-Eckpunkt am weitstens entfernt (e2), der rechte-untere am wenigsten weit (e1) -> analog für die 3 anderen Kreis-Viertel
- Du brauchst nicht alle Segmente innerhalb es "umgeschriebenen Rechtsecks" prüfen: es reicht wenn du dir das 1. Segment mit Kreis irgendwie ausrechnest (z.B. suchst du dir den, der in der gleichen Reihe, aber rechts vom Mittelpunkt ist [kann man noch weiter optimieren, wenn du 'n' in die Berechnung miteinbeziehst]). Wenn du eines hast, brauchst du immer nur die links, rechts, oben und unteren Segmente prüfen. Wenn eines davon ebenfalls ein Kreis-Segment beinhaltet, prüfst du wieder links,rechts, unten und oben => Rekursion.
Kleines Bsp. zum besseren Verständis:
Vom Kreis-Mittelpunkt einfach bei der X-Koordinate 'n' dazuaddieren -> Somit weisst du, in welchem Segment mit sicherheit ein Kreis-Teil liegt (dazu brauchst du die Modulo-Operation). [Segment 16]
Jetzt prüfst du das linke Segment [15]mittels oberen beschriebenen Verfahren -> Keine Segmetn mit Kreis-Teil
Das rechte Segment [17] ist ebenfalls kein gesuchtes Segment
Das obere [10] ist eines. Also prüfst du ab dort weiter:
links [9] ist eines -> von dort aus weiterprüfen ...
rechts [11] ist keines
oben [3] st eines -> von dort ebenfalls weiterprüfen ...
unten [16]: ist bereits bekannt, dass es ein gesuchtes Segment ist -> dort nicht mehr weiterprüfen
Ich habe mehrere voneinander abhängige Klassen, die prinzpiell nur lesend verwendet werden können (internal Konstruktor, internal set-Accessoren, geben nur ReadOnly-Collections zurück). Dies muss zwinged so sein.
Nun entwickle ich gerade eine Art Editor dafür, der per Reflection das alles ändern kann. Im Editor kann man das ganze dann binär serialisieren (XML kann man ja nur serialisieren, wenn man public Set-Accessoren usw hat) und die serialsierte Datei in einem anderen Programm öffnen.
Soweit so gut. Aber nun fangen die Probleme an: Da die Klassen-Bibliothek bei weitem noch nicht fertig ist, kann ich natürlich keine Binär-Dateien aus vorhergehenden Versionen laden.
Wie umgeht man ein solches Problem? Einen Konverter für Version A nach Version B schreiben? Währe wohl ziemlich aufwändig bzw. beim momentanten Stand der Entwicklung mit mind. eben so hohem Aufwand verbunden wie das Implementieren der ganzen Klassen-Bibliothek mit Editor.
Für Hinweise und Anregungen wäre ich sehr dankbar!
Bei der ListBox fügt du einfach in die Items-Collection ein Objekt hinzu. Um an den Text zu gelangen, ruft die ListBox die ToString()-Methode des Objektes auf.
Du kannst also jedes beliebige Objekt in einer ListBox darstellen.
Das Tag-Property ist genau dafür da, dass man zu einem Control ein Objekt dazuspeichern kann, um z.B. später festzustellen, welches Objekt sicher ändern muss, wenn das Control sich geändert hat.