Dein ViewModel muss das INotifyPropertyChanged-Interface implementieren.
Siehe dazu: https://mycsharp.de/forum/threads/118261/artikel-mvvm-und-databinding
Die Lösung aus diesem Beitrag ist bei uns seit 2 Jahren im Einsatz: https://mycsharp.de/forum/threads/123639/pdfs-erstellen-unter-asp-net-core
Nur unter Linux haben wir es noch nicht zum Laufen gebracht.
Die Bedingungen sollen ja miteinander verknüpft werden, daher:
IQueryable<MyEntity> query = set;
if (machineId > 0)
{
query = query.Where(entity => entity.MachineId == machineId)
}
if (lindeId > 0)
{
query = query.Where(entity => entity.LineID == lineID)
}
var data = await query.ToListAsync(ct);
Oder so:
T MyMethod<T>() where T: new()
{
return new T();
}
Diese Diskussion führt zu nichts. Die Helfer haben dir zu deinem Problem geantwortet. Deine Reaktion ist völlig unnötig. Daher ist jetzt hier zu. Bitte beachte zukünftig [Hinweis] Wie poste ich richtig?
Doch wie mache ich das per Code-Behind ?
Man würde den Inhalt der Canvas im XAML an die Canvas binden. So könntest du auch Trigger definieren.
Siehe dazu [Artikel] MVVM und DataBinding
Man kann Trigger zwar auch im Code-behind definieren, aber das ist umständlich, schwer zu lesen und zu verstehen, und von WPF eigentlich auch nicht so vorgesehen. Daher wirst du auch kaum jemanden finden, der dir damit weiterhelfen könnte.
Alle Variablen erhalten ja auch alle richtigen Werte aus dem Grid, ABER dann kommt die Fehlermeldung.
An welcher Stelle gibt es denn die Exception?
Die erste Spalte heißt doch "location" und nicht "locationdatagrid", oder?
Welchen MediaPlayer meinst du? WPF? WinForms?
Ich glaube, ihr redet aneinander vorbei 🙂
@Palladin007
Ja, wenn eine Klasse IDisposable implementiert, dann muß man selbst dafür sorgen, daß am Ende Dispose aufgerufen wird. Entweder durch den Aufruf der Methode oder durch die Verwendung des using
-Statements.
DependencyProperties und DB-Abfragen haben im ViewModel nichts zu suchen. Hier gibt es zwei Artikel dazu, die dir weiterhelfen könnten:
[Artikel] MVVM und DataBinding
[Artikel] Drei-Schichten-Architektur
Vielleicht findest du ja Hilfe hier
>
Daher ist jetzt hier auch zu. Bitte beachte zukünftig [Hinweis] Wie poste ich richtig?
Keine einzige Anleitung, auch nicht der Artikel MVVM enthält dahingehend eine eindeutige Antwort.
Ein kleiner Hinweis in dieser Richtung hätte mir jedoch etliche Stunden Probierens mit dem falschen Event gespart.
Im Artikel steht doch:
2.4 ViewModel-Auflistungen
Eine eigene Implementierung der INotifyCollectionChanged-Schnittstelle kann man sich übrigens sparen, denn der Framework enthält für diesen Zweck bereits die ObservableCollection-Klasse.
Und in der Doku dazu steht gleich als erstes:
Notifies listeners of dynamic changes, such as when an item is added and removed or the whole list is cleared.
Manchmal erspart Lesen auch etliche Stunden Probieren 🙂
Alle gefundenen Beispiele beziehen sich auf PropertyChange für Einzeleigenschaften und CollectionChange für die Items innerhalb einer Collection
Genau so ist es.
Alles Wichtige dazu findest du u.a. in [Artikel] MVVM und DataBinding
Wo genau liegt das Problem? Was funktioniert nicht? Was hast du schon probiert?
Schau mal in [Hinweis] Wie poste ich richtig?, du mußt uns schon ein paar mehr Infos geben, um dir helfen zu können.
Schau auch mal in [Artikel] MVVM und DataBinding, besonders in den Abschnitt Debugging, um deine DataBindings debuggen zu können.
Aber was rufe ich auf, um mich so teuer wie möglich zu verkaufen, ohne aber unverschämt zu sein?
Das ist die falsche Frage 🙂
Du mußt jemand finden, der dir ein gutes Angebot machen will, weil er deine Qualifikationen braucht.
Wenn du also gut mathematische Algorithmen programmieren kannst, dann solltest du dir erstmal ein Unternehmen (oder eine Behörde oder so) suchen, wo Leute mit dieser Qualifikation benötigt werden. Und dann mußt du auch irgendwie zeigen können, daß du diese Qualifikationen besitzt. "Kann ich, hab ich schon gemacht, vertraut mir einfach" kommt in einem Jobinterview nicht so gut an. Am besten hast du Code, den du zeigen und erklären kannst, damit die Leute wissen, daß du es auch selbst geschrieben hast, und weißt, was du tust. Wenn du deinen Code bei GitHub hostest, dann kannst du gleich den Link in deine Bewerbungen reinschreiben.
Und über das Gehalt redet man ja meist auch erst zum Schluß. Wenn also schon klar ist, daß beide Seiten an einer Zusammenarbeit interessiert sind.
Ich würde für WPF auch uneingeschränkt AvalonEdit empfehlen, damit kann man Editoren für alle möglichen Sprachen inklusive Syntax-Highlighting und Intellisense erstellen. MVVM wird auch unterstützt.
Für das Layout muß man überhaupt nichts berechnen, dafür hat WinForms bereits alles, was man braucht. Meistens jedenfalls.
Siehe z.B.:
Position and layout of controls
Walkthrough: Arranging Controls on Windows Forms Using a TableLayoutPanel
Warum das so ist, steht in [FAQ] Warum blockiert mein GUI?
Wie man es richtig macht, steht in [Artikel] MVVM und DataBinding. Darauf bist du ja schon öfters hingewiesen worden. Schau dir das ruhig mal an, das macht alles wesentlich einfacher.
Warum postest du diese Frage im Forum "Buchempfehlungen"? Lies mal bitte [Hinweis] Wie poste ich richtig?.
Zum Thema: Meinst du Eigenschaften? Hier wird erklärt, wie man den Einstieg in C# findet: [FAQ] Wie finde ich den Einstieg in C#?
Leider nicht. Wenn du das ControlTemplate eines Elements überschreiben willst, mußt du es komplett ersetzen.
Die DataGridColumn ist in WPF nicht Teil des VisualTrees, daher ist auch das Window kein übergeordnetes Element. Anstatt RelativeSource
zu verwenden, kannst du mit ElementName
direkt auf ein benanntes Element zugreifen. Siehe dazu die Beispiele in [Artikel] MVVM und DataBinding.
Dafür kannst du die Setter.TargetName-Eigenschaft verwenden. In der Doku findest du ein Beispiel.
Hier findest du eine Anleitung, um eigene Themes zu erstellen: Thememanager
Du hast vergessen, das INotifyPropertyChanged-Interface zu implementieren. Siehe dazu diese Anleitung: [Artikel] MVVM und DataBinding
Das ViewModel ist dafür verantwortlich, Zustände zu speichern. Die Benutzeroberfläche ist nur dazu da, die Zustände anzuzeigen und auf Benutzereingaben zu reagieren.
In deinem Beispiel wird das UserControl jedes Mal neu erstellt, dadurch geht der Zustand verloren. Erstelle dir ein ViewModel und binde das an das UserControl, dann wird es funktionieren. Siehe dazu den von Th69 verlinkten Artikel, sowie [Artikel] Drei-Schichten-Architektur
Stell einfach deine Frage und schreib einen Link zum alten Thema und den Grund für den CrossPost.
Genau so würde ich es auch empfehlen.
Bezüglich des Schrödinger-Buches: siehe Programmieranfänger - Lohnt sich Anfangen (mit Informatikstudium) mit 33 Jahren noch? oder [Buchfrage] Bestes Buch für blutige Anfänger basierend auf WPF bzw. die Foren-Suche
Konkret möchte ich zwei Versionen einer Webseite vergleichen (die gerenderten Versionen). Wenn ich die Pixel 1 zu 1 vergleich, dann würde ich eine fast 100%ige Änderung erhalten, wenn ich oben auf der Webseite eine Zeile Text einfüge. Ich suche nun nach einem Verfahren/Algorithmus, der mir in diesem Fall ein realistischeres Ergebnis liefern würde.
Was genau wäre für dich in diesem Fall ein realistisches Ergebnis?
Wenn man nur wissen möchte, ob ein String einen Zeilenumbruch enthält, dann geht das am einfachsten so:
bool isMultiLine = someText.Contains('\n');
Das funktioniert mit Texten von (fast) allen Systemen, denn die meisten Systeme benutzen irgendeine Kombination mit '\n' oder nur '\n' für einen Zeilenumbruch.
Beschäftige dich mal mit objektorientierter Programmierung. Steuerelement in der UI und Anwendungs-Einstellungen sind auch nur spezielle Fälle davon. Damit kannst du dich dann beschäftigen, wenn du die Basics beherrschst.
Arbeite am besten mal ein Buch durch, z.B. das kostenlose C#-Buch vom Rheinwerk-Verlag: Visual C# 2012 - Das umfassende Handbuch von Andreas Kühnel.
Das Forum ist besser geeignet, wenn du konkrete Fragen hast. Lernen und üben können wir dir hier nicht abnehmen.
Siehe dazu auch [Hinweis] Wie poste ich richtig?
Siehe dazu auch [Artikel] MVVM und DataBinding, 4. Kapitel: Styles und Trigger.
Wenn du das Bild selber zeichnest, dann mußt du auch selbst die PictureBox skalieren und die Scrollbars anpassen. Oder andersherum das Bild skalieren, damit es in die PictureBox paßt.
Warum sollte die PictureBox eigentlich zu langsam sein, um ein Bild anzuzeigen? Sie wird ja auch nur die GDI-Funktionen des Betriebssystem dafür aufrufen.
Es ist wie beim Lernen von anderen Sprachen auch: Du solltest nicht nur die Lektionen durcharbeiten, sondern auch die Übungen dazu machen. Dann kannst du verstehen, anstatt auswendig zu lernen. Wenn es in deinem Kurs keine Übungen gibt, dann such dir welche im Netz, schreib ein eigenes kleines Programm, oder schau dir den Code von anderen Leuten an.
Denke, daß es mit asynchronen Methoden allein nicht besser wird. Der ganze Code ergibt irgendwie keinen Sinn. Warum hast du denn z.B. die gesamte "ServerEngine"-Klasse mit statischen Methoden implementiert?
public class ServerEngine
{
public ServerEngine(int port)
{
//...
}
public static void Receiver(object server)
{
if ((ServerEngine)server) // ...
}
}
Hier fehlt es dir einfach an den Basics bzw. Grundlagen von objektorientierter Programmierung und C#.
Ich würde empfehlen, erstmal damit anzufangen, und sich dann im Bereich Web-Entwicklung zu belesen, und DANN überlegen, wie (und ob) man einen Webserver implementiert!
Danke für den Hinweis! Da ist beim Migrieren etwas verloren gegangen. Wir werden uns darum kümmern.
Ich weiß nicht, wie es den Anderen geht
Lernen finde ich immer gut. Und hier handelt es sich um ein kostenloses Angebot.
Ich hab es nur in den Smalltalk-Bereich verschoben, da es keine Buchempfehlung ist.
War ein bißchen mißverständlich ausgedrückt. Ein UserControl weiß nichts von MVVM oder vom ViewModel. Es kann mit oder ohne ViewModel eingesetzt werden. Deshalb gibt es im UserControl auch einen anderen Mechanismus für die Aktualisierung der Bindings (also DependencyProperties anstatt IPropertyChanged).
Und ein UserControl bekommt auch kein ViewModel als DataContext, sondern es werden Werte (keine ViewModels) an die DependencyProperties gebunden.
Meistens braucht man eh keine UserControls in WPF. Ein Anwendungsfall wäre, wenn es in unterschiedlichen Projekten wiederverwendet werden soll. Und dann muß es auch unabhängig vom verwendeten VM sein. Und bei ReactiveUI werden UserControls als IViewFor<T>
eingesetzt, aber das ist hier nicht relevant. Und für alles andere ist ein Template ausreichend.
Das UserControl ist die View (das "V" in MVVM), und das PropertyChanged-Ereignis gibt es nur im ViewModel (das "VM" in MVVM). Und die View kennt das ViewModel nicht, daher kennt das UserControl auch keine PropertyChanged-Ereignisse!
Das UserControl hat stattdessen DependencyPropertys (bzw. Ereignisse) als öffentliche API. Daran kannst du dann deine ViewModel-Eigenschaften binden, und natürlich auch DependencyPropertys von anderen Controls. Was innerhalb eines UserControls passiert, ist für den Rest der Anwendung völlig irrelevant.
In dieser Zeile verwendest du den bereits geänderten Wert für x
anstatt den Original-Wert:
y = (x * Math.Sin(angle * Math.PI / 180)) + (y * Math.Cos(angle * Math.PI / 180));
Ich vermute es fehlt ein Nicht-Null-Wert – was auch immer das bedeuten mag.
Ein "Nicht-Null-Wert" ist ein Wert, der nicht null
ist. Du kannst dem Template nicht null
zuweisen, aber wo genau das auftritt, sollte dir die Fehlermeldung sagen.
Ansonsten scheint es in deinem Code noch mehrere andere Merkwürdigkeiten zu geben. Wo defininierst du z.B. das Template für "ExpanderHeaderCollapsedType", und warum gibst du als TargetNullValue
für einen String-Wert ein "true" an?
Indem du in der Methode ein Array erstellst, dann mit Werten befüllst, und es zurückgibst:
private string[] CreateArray()
{
string[] cryptKey = new string[33];
// ....
return cryptKey;
}
Und dann kannst du es als Parameter an eine andere Methode übergeben:
var cryptKey = CreateArray();
DoSomething(cryptKey);
Hier gibt es ein paar Links für den Einstieg: [FAQ] Wie finde ich den Einstieg in C#?
Für die Benutzeroberfläche würde ich ein Grid mit SharedSizeGroup in einem ItemsTemplate verwenden. Als Datenmodell hat du eine Auflistung von Wochen verwenden, die eine Auflistung von (jeweils 7) Tagen haben. Die Anzahl der Wochen sollte dabei allerdings nicht statisch sein, weil ein Februar auch hin und wieder mal nur 4 Wochen haben wird.
Diese Listen kannst du dann an das ItemsTemplate binden, und dem Grid das Layout überlassen. Hier gibt es ein Code-Beispiel: Generating grid dynamically in MVVM pattern.
Daß du keine fertige Lösung verwenden willst, heißt ja nicht, daß du nicht auch in Code von anderen Leuten reinschauen kannst, die das schon mal umgesetzt haben. Kalender wurden schon mehrfach umgesetzt, und der Algorithmus und das Datenmodell basieren meistens auf dem gleichen Prinzip.
Du solltest bei deinem Datenmodell dann halt noch beachten, daß sich Termine über mehrere Tage oder sogar Monate erstrecken können.
Da fehlt mir die nötige Erfahrung.
Dir fehlen die Grundlagen, daher der Link auf den Artikel.
Konvertierung von "int" in "PokerYT.SUI" nicht möglich.
Die Fehlermeldung ist doch relativ aussagekräftig: Du hast extra eine Enum dafür definiert, verwendest aber Integer-Werte.
Bitte lies dir mal die Grundlagen von C# durch. Du kannst nicht erwarten, daß dir das einfach so zufliegt...
Bitte poste deinen Code nicht als Plain-Text und verwende Code-Tags [Hinweis] Wie poste ich richtig?
Ansonsten empfehle ich einen Blick in [FAQ] Wie finde ich den Einstieg in C#?
Es gibt keine "einzelne Anwendung auf der Soundkarte". Die Soundkarte gibt nur Audio-Signale aus. Die Signale von den einzelnen Anwendungen werden im Betriebssystem gemischt, und dann auf der Soundkarte ausgegeben. Wenn du die Lautstärke einer bestimmten Anwendung messen willst, mußt du die Signale vor der Mischung abgreifen. Und dazu gibt es die genannte Schnittstelle.
Es gibt für die API eine Dokumentation und Quellcode-Beispiele. Sicherlich nicht für dein spezielles Problem, aber mit ein bißchen Anstrengung findest du dafür die Lösung.
Das heißt Audio Session und dafür gibt es die WASAPI-Schnittstelle: Session Volume Controls
Du solltest dir auch mal [Artikel] MVVM und DataBinding anschauen. Wenn man DataBinding verwendet, dann kann man weitestgehend auf Events verzichten, und man muß sich auch keine Sorgen machen, in welchem Thread was ausgeführt wird.
Und auch Datenbank-Operationen haben nichts in der UI verloren. Siehe dazu [Artikel] Drei-Schichten-Architektur
Wenn du das beruflich machst, solltest du dich mal mit den Grundlagen der Software-Entwicklung auseinandersetzen. Sonst wirst du immer wieder von einem "kuriosen" Problem zum anderen stolpern.
Ich hab mich entschieden, die PDF-Erstellung mit XSL-FO in Kombination mit Razor umzusetzen.
XSL-FO ist als Format genau dafür geschaffen worden, Druckdokumente zu erstellen, und ist leicht zu verstehen, wenn man mit HTML und CSS Erfahrung hat. Hier gibt es die Doku und ein paar Tutorials. Und mit Razor als Template-Engine kann man aus Daten einfach Reports erstellen, das kenne ich noch von ASP.NET MVC.
Ich verwende dazu das Package RazorEngineCore.
So kann man damit ein Template kompilieren und auswerten:
// Compiling is only done once
IRazorEngine razorEngine = new RazorEngine();
var compiledTemplate = await razorEngine.CompileAsync<RazorEngineTemplateBase<TModel>>(templateContent)
.ConfigureAwait(false);
// Resolving a FO template for the specified model
string foTemplateResult = await compiledTemplate.RunAsync(instance =>
{
instance.Model = model;
}).ConfigureAwait(false);
Für das Rendern des Templates in eine PDF verwende ich das Package Fonet.Standard (Source Code, Wiki). Das funktioniert soweit sehr gut. Ein paar Einschränkungen muß man dafür allerdings hinnehmen:
Bilder mit transparentem Hintergrund werden nicht unterstützt
SVGs werden nicht unterstützt (aber andere Vektor-Formate)
Tabellen mit automatischen Spaltenbreiten sind nicht möglich
Es können nur Schriftarten verwendet werden, die im Betriebssystem installiert sind
So funktioniert das Rendern der PDF:
var foNetDriver = FonetDriver.Make();
foNetDriver.Options = /* Set PDF options */;
foNetDriver.CloseOnExit = false; // Don't close stream after rendering
foNetDriver.ImageHandler = /* Set callback to load images from files or resources */;
foNetDriver.Render(foInputStream, pdfOutputStream);
Insgesamt sind das ca. 100 Zeilen Code in einer .NET-Standard-Bibliothek, die wir zukünftig für Web- und Desktop-Anwendungen verwenden können.
Das Template sieht z.B. so aus:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
<fo:region-body region-name="page-body" margin-bottom="2cm" margin-top="2cm" />
<fo:region-before region-name="page-header" extent="2cm" />
<fo:region-after region-name="page-footer" extent="2cm" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simple" font-family="Montserrat">
<fo:static-content flow-name="page-header">
<fo:block font-family="Montserrat SemiBold" font-size="22pt">
<fo:external-graphic src="logo.png" height="22pt" margin-right="1cm" />
@Model.CompanyName
</fo:block>
</fo:static-content>
<fo:static-content flow-name="page-footer">
<fo:block margin-top="2cm" text-align="right" font-style="italic" color="#777777">
@Model.Copyright
</fo:block>
</fo:static-content>
<fo:flow flow-name="page-body">
<fo:table table-layout="fixed"
inline-progression-dimension="auto"
width="100%"
padding-after="2cm"
font-size="8pt">
<fo:table-column column-number="1" column-width="5cm" />
<fo:table-column column-number="2" />
<fo:table-column column-number="3" />
<fo:table-column column-number="4" />
<fo:table-column column-number="5" />
<fo:table-header border-after-style="solid"
border-after-color="black"
border-after-width="thin">
<fo:table-row font-weight="bold">
<fo:table-cell>
<fo:block>
Mitarbeiter
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
Datum
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
Position
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
Team
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
Email
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
@{ int i = 0; }
@foreach (var item in Model.Employees)
{
<fo:table-row background-color="@(++i % 2 == 0 ? "white" : "#f7f7f7")">
<fo:table-cell>
<fo:block>
@item.Salutation @item.FirstName @item.LastName
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
@item.DateOfEntry.ToString("dd.MM.yy")
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
@item.WorkPosition
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
@item.Team
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<fo:basic-link external-destination="mailto:@item.EmailAdress">@item.EmailAdress</fo:basic-link>
</fo:block>
</fo:table-cell>
</fo:table-row>
}
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
Wenn die Schema-Datei im gleichen Verzeichnis liegt wie die Template-Dateien, bekommt man in Visual Studio sogar Intellisense für XSL-FO.
Das mag vielleicht ein bißchen over-engineered aussehen, ist aber wesentlich besser als DevExpress- und Crystal-Reports oder die Konvertierung von HTML- oder Word-Dateien.