könntest du bitte Code-Tags verwenden und den ganzen Programmcode hättest du auch nicht posten müssen.
ClickOnce kopiert soweit ich weiß immer nur die "relevanten" Files ins Zielverzeichnis. Ich glaube nicht, dass hier deine Dictionaries mitkopiert werden. Evt. musst du die unter Projekteigenschaften\Publish\Application Files noch einbinden oder manuell kopieren.
Meine Vermutung, das Bild mittels Dispose wieder freizugeben bevor du es erneut überschreiben kannst bestätigt sich in why does this code lock my files?.
Zum Lesen deiner Xml Daten: Ich hab zwar nirgends gelesen, dass man ein leeres DataTable verwenden muss, aber in allen (funktionierenden) Beispielen die ich gesehen habe, wird ein leeres verwndet. So auch hier in der MSDN: DataTable.ReadXml Method (XmlReader)
Eine Spalte aus deinem Datatable vergleichst du mit der Datenbank in dem du entweder die Spalte in die Datenbank kopierst und dort vergleichst oder die Spalte aus der DB in dein Programm holst und hier vergleichst.
Eventuel willst du ja auch mit DbDataAdapter arbeiten - der kann teilweise vollkommen selbstständig die Tabellen in der Datenbank anhand der Änderungen in einem Datatable aktualisieren.
Warum ReadXml nicht funktioniert kann ich dir nicht sagen und aber um etwas darüber sagen zu können müsstest du schon auch den Aufbau des Xmls und evt. der temp_DT posten.
zu deinem Id Vergleich: Du Vergleichst ob die DataColumn Namens ID der einen Tabelle ungleich der DataColumn Namens ID einer anderen Tabelle ist -> Natürlich; Sind doch zwei verschiedene Objekte.
Wenn du ungleiche Zeilen finden willst, musst du schon durch jede Zeile in haupt_DT.Rows die ID abrufen und sie in der temp_DT suchen. Entweder durchiterieren oder mit RowFilter.
Weil eine Wpf Anwendung eine Wpf- und keine Windows.Forms Anwendung ist. Ich habe bei meinem Projekt leider genau die selbe Konstellation und habe keinen Weg gefunden den Owner bei meinen Wpf-Windows zu setzen wenn das MainWindow ein WinForms Fenster ist.
Es gibt zwar allerhand Tricks und Tipps zu dem Thema aber wirklich funktioniert hat bei mir leider garnichts. Ich habs für mich so gelöst, das ich Modale Dialogfenster mit TopMost=true öffne, damit es nicht hinter das MainWindow fallen kann.
Wenn unerhofft doch jemand eine Lösung zu dem Problem postet würde mich das also auch sehr freuen. :)
In form eines riesigen Fernsehers mit Touch in Besprechungszimmern wärs schon wieder praktisch - die ganzen Beamerlösungen, welche Handbewegungen an der Wand erkennen, funktionieren ja nur sehr bescheiden.
Ich verwende Commands mit der gleichen Implementierung aber ich verwende die CanExecute Methode bzw. das Event eigentlich nie - Ich verwende öfters eigene Properties, die dann über StyleTrigger evt. etwas disablen.
Ich finde die Implementierung mittels CommandManager.RequerySuggested auch eher unschön:
Es wird dann ja quasi für jeden Command der gerade in einer View steckt bei jeder Änderung die die View bemerkt ein CanExecuteChanged erzeugt oder? Zusätzlich bekommt der Command nichts davon mit, wenn sich dessen Zustand im Hintergrund geändert haben sollte.
Wo genau ist dein Problem? Was hast du probiert und was daran funktioniert nicht?
Wie dus angehen sollst willst du wissen? Schreib ein ItemTemplate welches abhängig von einem Zustand in deinem ViewModel das richtige Symbol darstellt.
Anderseits wünsche ich mir schon lange einen Schreibtisch, dessen gesamte Oberfläche ein Display ist.
Also das würde mir riesig gefallen. Wenn man die Sachen am Desktop dann auch "angreifen" könnte wärs noch cooler. Evt. ermöglicht das eine Technologie wie Leap Motion bald einmal.
Die Verwendung des Properties hättest du dir auch ergooglen können - in BasedOn wird natürlich ein anderer Style erwartet, welchen du zB mit StaticResource einbinden kannst.
Das BasedOn muss in den "darunterliegenden" Styles angegeben werden. Die Appl.xaml ist ja die höchste Ebene - wenn ein neuer Style den alten übernehmen soll dann braucht man dazu das BasedOn.
Auch muss man beachten, dass ein Property durch einen Style _nicht_ mehr gesetzt wird, wenn dieses bereits durch einen manuellen Wert gesetzt wurde.
Gibt es denn keine passenden Events die bei der bestimmten Aktion die gewünschte Aktion ausführt? Ich finde deine Variante ein Dummy UserControl zu verwenden in der Situation nicht so schlimm, was stört dich daran?
Ich behaupte mal garnicht aber eventuel gibts ja alternive Möglichkeiten. Was macht die aufgerufene Methode in etwa und zu welchem Zeitpunkt soll sie aufgerufen werden? Vor, während oder nach dem Laden des Controls?
Aber ließ und versteh doch was ich sagen will: SelectedItem kann _nicht_ automatisch irgendwelche Zurodnungen treffen, wenn die Quell- und Ziel- Typen unterschiedlich sind.
Einen Vorschlag hab ich bereits gemacht indem du die Enumwerte auf Strings änderst.
Alternativ kannst du das DataTable typisieren und änderst die Spalte Anrede auf den Typ "Anrede" oder du baust im SelectedItem Binding einen Converter ein, welcher von String auf dein Enum und Retour konvertiert.
Das WPF so gscheit ist und von SelectedItem(Enum)->DataRow(String) zu konvertieren kann man annehmen nachdem jedes Objekt eine Methode .ToString() besitzt aber wie soll .NET im Umkehrschluß wissen, dass dein String im DataTable ein Anrede Typ ist???
Und die ItemsSource der ComboBox ist eine DeinEnum[], String[]?
SelectedItem funktioniert nur, wenn quell und zieltyp identisch sind - du ladest gerade strings aus der Datenbank und hast aber EnumWerte(welche keine Strings sind) in deiner ComboBox. Ändere mal deine ItemsSource auf string[] dann sollte es denke ich hinhauen.
Wie wird ein Eintrag im Datatable selektiert? Listbox?
Was ist die DataSource "Grundlage" deiner ComboBox und Textboxen? Eine DataRow? Ein DataTable?
Was für einen Datentyp hast du denn im DataTable für die Spalte Anrede? Int, String oder explizit deinen Enum-Typ?
Was genau passiert denn(nicht) in der ComboBox? Wie hast du getestet, dass der Wert der ComboBox in das DataTable geschrieben wird und wie verhält es sich denn beim Laden der Werte?
Und für XML Code gibt es bessere Formatierungsmöglichkeiten hier.
Sind das auf der Grafik zwei Gruppen die jeweils die dichte Menge an Datenpunkten zusammenfassen oder 4 Gruppen?
Und wie hast du manuell diese Gruppierungen gesetzt? Wie bist du dabei vorgegangen? Kannst du dieses Vorgehen nicht direkt als Algorithmus umsetzen? Wenn nicht, warum nicht?
Ich verstehe deine Frage nicht wirklich - Dein Aufbau ist grundsätzlich so ok würde ich behaupten.
Meinst du, wie du im PlayerVM zu einem TrackVM kommst bzw. wie das TrackVM in das PlayerVM kommen soll? Hast du schon probiert dein Konzept umzusetzen? Evt. geht dir dabei der Knoten auf.
Ok das lässt sich in deiner Konfiguration so erklären:
Das liegt am UpdateSourceTrigger welcher im Standardfall "LostFocus" ist. Da du nur ein Control in deiner Testapplikation hast ist es auch unmöglich dass dieses eine den Fokus verliert und daher wird set und get nie aufgerufen. Füge noch einen Button oder eine andere Tb ein dann wird der Setter und Getter auch beim Verlassen aufgerufen.
Alternativ kannst du wie Quaneu bereits in seinem Code erwähnt hat UpdateSourceTrigger auf PropertyChanged setzen.
Genau deswegen funktionierts ja auch nicht - Wenn du jedesmal einen anderen oder den "richtigen" Wert zurück geben würdest, würde sich die Anzeige auch dementsprechend anpassen.
Ebenso merken sich die Properties der Controls ihre Werte und tun daher nur dann was, wenn sich wirklich etwas geändert hat und wenn das nicht der Fall ist, weil du immer den selben zurückgibst, wird natürlich der angezeigte Wert nicht verändert. Da kannst du noch so oft PropertyChanged feuern.
ohne dein Problem mit gesharten Objekten in verschiedenen Auflistungscontrols jemals gehabt zu haben, verwende ich bei mir hin und wieder eine Lösung die dir hier ebenfalls helfen könnte:
Und zwar habe ich eine Wrapperklasse erstellt, welche das Objekt um die notwendigen "Gui-Spezifischen" Elemente erweitert.
z.B:
class MyListItem
{
public object Item{get;set;}
public bool IsSelected{get;set;}
}
In den Bindings musst du halt das .Item. noch zusätzlich anführen was aber mMn. kein Problem darstellen sollte.
Du müsstest halt dann in deinen ViewModels unterschiedliche Collections für die unterschiedlichen ListViews/TreeViews erstellen die jeweils eigene MyListItems haben die wiederum intern sich die gleichen Objekte sharen.
Ich würde nur die Informationen über die Termine speichern und dann mit geeigneten Abfragen die Daten live abrufen. Ich glaub nicht das die Vorberechnung von Terminen hier notwendig bzw. sinnvoll ist. Auch weil bei einem theoretisch unendlichem zyklischen Termin man unendlich viele Einträge generieren müsste sofern es kein maximales Datum in der DB gibt.
Ein Array ist aber ein Referenztyp und beim Übergeben des Arrays wird daher nur die Referenz auf dieses übergeben und nicht alle Werte extra kopiert.
Lg, XXX
//EDIT: Ansonsten kannst du auch deinen ValueType in einer Klasse kapseln und dieses Objekt dann überall verwenden.
//EDIT²: Letzteres wird dein Problem aber nicht beheben da eine Referenz auf einen Typen vermutlich mehr Speicher verbraucht als ein einfaches byte - Das Sinnvollste werden Arrays sein die du dann immer als "ganzes" übergibst.