Hi Jack30lena!
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.
Danke nochmals!
lg
Hi zusammen!
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.
Wäre für Hilfe sehr dankbar 😃
Hi,
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().
void _list_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
listview.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (listview.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
((ListViewItem)listview.ItemContainerGenerator.ContainerFromIndex(listview.Items.Count - 1)).BringIntoView();
listview.ItemContainerGenerator.StatusChanged -= new EventHandler(ItemContainerGenerator_StatusChanged);
}
}
So funktionierts bei mir.
lg
dafür hat das ListViewItem eine eingebaute Methode:
ListView.Items[Index].EnsureVisible();
//edit: hmm da war ich wohl etwas vorschnell, ich hab das so in einer formanwendung drin. warum gehts das denn bei WPF nicht???
ListView.Items[Index].BringIntoView();
Habs zwar nicht getestet, aber laut Doku scheints das zu sein.
mfg
Hi,
Hilft dir vielleicht ein MultiTrigger, der die beiden Properties enthält, weiter?
MultiTrigger-Klasse
lg
Hi,
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.
lg
Hallo DeveloperX,
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.
Hi,
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.
lg