C# Avalonia .Net5 - Erstellen von Controls?

1 Antwort

Ich kenne Avalonia nicht, aber Du von DataBindings redest, aber DataBindings bzw. MVVM seit WPF sehr beliebt ist, gehe ich mal davon aus, Du redest von MVVM und willst es nicht nutzen?
Das deckt sich auch ungefähr mit dem, wie ich beim grob drüber scrollen so gesehen habe.

Kurz und knapp: Lass es bleiben.
MVVM ist sinnvoll und DataBinding löst viele Probleme, die man vorher manuell lösen musste. Wie gesagt, ich kenne Avalonia nicht, aber bei WPF, Xamarin oder UWP habe ich schon oft gesehen, wie Leute mit WPF ohne MVVM arbeiten wollten und dabei nur endlos von einem Problem zum Nächsten gestolpert sind.

Abgesehen davon wird das Thema DataBinding bei der Erstellung des Controls gar kein Thema sein, sondern erst bei der Verwendung. Das heißt, Du kannst dir jeden Avalonia-Artikel zum Erstellen von Controls anschauen.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

FaTech 
Beitragsersteller
 20.11.2021, 22:08

Ich verstehe vieles in der Doku zu Avalonia, aber DataBindings, da steige ich nicht durch, es haut einfach nicht hin

0
FaTech 
Beitragsersteller
 20.11.2021, 22:19

Mein Vorhaben liegt darin, dass ich einen Button habe und den möchte ich so oft haben, wie ich bestimmte Dateien habe und als Text soll dann halt die erste Zeile der Datei stehen. Mein Problem ist, ich verstehe nicht, wie ich das mit den DataBindings richtig umsetzen muss. Ich habe alles so gemacht, wie in der Doku, doch es scheint nicht zu gehen. Ich habe sogar Code 1 zu 1 kopiert, nur um es zu testen

0
Palladin007  20.11.2021, 22:53
@FaTech

Dabei kann ich nicht helfen, wie gesagt: Ich kenne Avalonia nicht.

Bei WPF:

Der DataContext ist die Quelle. Ein Control bekommt von dem Parent-Control den DataContext übergeben (oder Du bindest etwas anderes) und jedes Binding verwendet den DataContext als Quelle (außer Du setzt eine andere Quelle, WPF kennt drei weitere Arten von Quellen)

Der Pfad vom Binding wird per Reflection ausgewertet und arbeitet auch mit Punkten, wie in C#. Also ein Binding mit dem Pfad "Property1.Property2" wertet "DataContext.Property1.Property2" aus, wie als hättest Du in C# eine "DataContext"-Variable und bräuchtest von der Property1, was wiederum Property2 hat.

Das schöne dabei:
Das Binding kümmert sich (wenn Du alles richtig gemacht hast) darum, dass Änderungen auch in der View aktualisiert werden, je nach Situation auch in beide Richtungen.

Ein Binding ersetzt also das simple setzen von einer Property damit, dass Du definierst, wo die WPF-Runtime den Wert her bekommt und was sie damit tun soll. Und genau das tut sie dann auch - permanent und automatisch.

Klar kann man das alles auch manuell machen, aber gerade bei verketteten Zugriffen (DataContext.Property1.Property2.Text.Length) wird das überwachen von Änderungen schnell zur Qual, weil sich ja nicht nur der Text am Ende, sondern auch der DataContext und die beiden Properties dazwischen sich ändern können.
Außerdem musst Du dich nicht darum kümmern, die DataContext-Instanz dort hin zu bekommen, wo Du sie brauchst, besonders bei komplexen Programmen kann das zur Hölle werden. Und dann kann ein Binding ja noch viel mehr, als nur das kleine bisschen.

Abgesehen davon:

Ich rate mal, dein "Wissen" kommt von irgendwelchen (Video-) Tutorials? Wenn ja, lass es bleiben, die taugen in 99% der Fälle nichts. Schnapp dir ein gutes Buch, das vermittelt die Grundlagen und kleine Beispiele, mit denen Du experimentieren kannst.

Und danach gilt Regel Numero Uno:
Nur weil Du es nicht verstehst, nicht aufgeben. Das absolut wichtigste überhaupt in diesem Tätigkeitsgebiet ist Durchhaltevermögen und die Fähigkeit, sich trotz fehlendem Wissen oder Verständnis für eine Thematik, sich selbiges selber und natürlich ohne Lehrer anzueignen.
Das kommt nicht von jetzt auf gleich, aber aufgeben und dann einfach einen Weg drum herum suchen, geht immer schief - immer. Die Frage ist nur, wann.

0
FaTech 
Beitragsersteller
 21.11.2021, 00:33
@Palladin007

Ich lese mir deinen Text nochmal später genauer durch. Danke auf jeden Fall für deine Antwort. Mein Wissen kommt ursprünglich von Videos, aber das schon lange nicht mehr. Ich bin derzeit mitten in einer Ausbildung in dem Fachbereich, allerdings arbeiten wir in der Firma nur mit den Windows Frameworks und in der Schule mit anderen Sprachen. Dokumentationen verstehe ich gut, nur eben diesen Abteil verstehe ich 0 aktuell.

Das jetzige Projekt ist auch nicht mein erstes, aber mein erstes Crossplatformes

0
Palladin007  21.11.2021, 00:43
@FaTech
arbeiten wir in der Firma nur mit den Windows Frameworks

Generell oder nur auf "große"/"zentrale" Framework (UI, WPF, etc.)? Generell wäre ziemlich dumm, viele sehr gute Frameworks kommen aus der Community und werden schon seit zig Jahren genauso professionell gepflegt. Das ist auch der Weg, wo sich alles hin bewegt, deshalb sind neue Frameworks von Microsoft ganz bewusst so gebaut, dass sie mit Fremd-Frameworks (z.B. Logging) gut zusammen funktionieren.

Und UI-Frameworks + CrossPlatform: MAUI erfüllt genau das und ist von Microsoft. Allerdings habe ich damit keine Erfahrung.

0
FaTech 
Beitragsersteller
 21.11.2021, 00:49
@Palladin007

Wir arbeiten mit Windows Forms, aufgrund dessen, dass viele alte Programme darin geschrieben sind und die Entwicklung schneller geht. WPF gibt es aber auch ab und an. Ich selber möchte mich aber mehr in Richtung Crossplatform bewegen, weshalb ich mit Avalinia gestartet bin. Das gesamte Programm ist fertig und funktioniert perfekt, nur die DataBindings machen mir schwer zu schaffen

0
Palladin007  21.11.2021, 01:21
@FaTech
Windows Forms, aufgrund dessen, dass viele alte Programme darin geschrieben sind und die Entwicklung schneller geht

Ersteres stimmt, Letzteres ist aber ein herrlich bescheuertes Schein-Argument :D
Das geht nur schneller, weil die Personen, die das behaupten, es einfach besser kennen. Das allerdings kann ein gutes Argument sein, nur darauf ausruhen sollte man sich nicht.

WinForms ist auf den ersten Blick intuitiver, weil man weniger Konzepte verstehen und anwenden muss, aber auch nur für die, die sie noch nicht verstanden und Erfahrung haben. Bei WinForms fällt davon vieles weg, die Probleme, die diese Konzepte lösen sollen, muss man dann aber auch selber lösen. Mit Glück frickelt man sich irgendeine meist uneinheitliche und lückenhafte Lösung, mit Pech macht man immer alles per Hand, so ziemlich immer zum Chaos führt.
Deshalb erfreut sich WPF seit 2006 ja auch so großer Beliebtheit und viele andere Frameworks (UWP, Xamarin Forms, Avalonia, MAUI) führen die ursprünglich mit WPF eingeführten Konzepte fort oder entwickeln sie weiter, weil sie sich einfach bewährt haben.

Ob Avalonia eine langfristig gute Lösung ist, weiß ich nicht.
Für den Einstieg kannst Du aber auch auf WPF setzen, das MVVM-Pattern ist ja allgemein gültig und die Binding-Konzepte sind vermutlich auch ungefähr ähnlich. Ich könnte mir vorstellen, dass der Einstieg in WPF leichter ist, das ist aber nur Spekulation. Definitiv gibt es aber mehr und potentiell bessere Literatur dazu, einfach weil es schon 15 Jahre alt ist.

Alternativ kannst Du auch auf Web-Entwicklung mit ASP.NET Core und einer beliebigen Front-End-Technologie setzen, mehr Cross-Plattform geht nicht. Einfach wird das aber nicht, im Web tickt vieles anders.
Dafür ist man mit der Web-Entwicklung eigentlich immer überall gern gesehen, praktisch überall braucht man das früher oder später und viele der Konzepte in ASP.NET Core sind nicht aufs Web beschränkt, sondern allgemein gültig und auch allgemein gerne gesehen/verwendet - und mMn. teilweise ein absolutes Muss in jeder Anwendung. Sieht man auch bei MAUI, das setzt viele dieser Konzepte ebenfalls um, obwohl es nichts mit Web zu tun hat.

0
FaTech 
Beitragsersteller
 21.11.2021, 01:28
@Palladin007

Naja, vom Thema Webentwicklung bin ich extra weg. Das wurde mir zu langweilig. Ich sehe mich eher im Software Bereich. Es gibt zwar Möglichkeiten eine Website zur Software zu machen, davon bin ich aber gar kein Freund. Dadurch entstehen Programme, welche sehr großen Speicher verbrauchen, weil jedes seinen eigenen Browser mitbringt und am Ende hätte man es als Software lösen können mit weniger Speicher. Naja und in Avalonia sehe ich aktuell noch keine Zukunft, wenn die sich nicht langsam mal bewegen und das Plugin updaten. Denn Visual Studio 22 ist raus und es läuft nicht. Ich bin sehr interessiert in MAUI, aber meines Wissens nach, wurde das noch nicht released? Und ich werde jetzt auch mein Programm nicht extra umstellen, weil es ist nicht gerade sehr klein und dadurch wäre es ein Riesen Aufwand

0
regex9  21.11.2021, 01:33
@FaTech

Data Bindings funktionieren in Avalonia wie bei WPF.

Zu erst einmal benötigst du eine ViewModel-Klasse.

class YourViewModel
{
  // ...
}

Diese stellt die Daten für das View bereit. Sie wird als DataContext für das View gesetzt.

<Window ... xmlns:vm="clr-namespace:YourNamespace;assembly=YourAssembly">
  <Window.DataContext>
    <vm:YourViewModel />
  </Window.DataContext>

  <!-- ... -->
</Window>

Dies könnte man auch im Backend-Code tun, so wie in der Avalonia-Dokumentation beschrieben. Ich persönlich lagere auch das lieber im View aus.

Da du mehrere Dateien darstellen möchtest, brauchst du eine Liste an Objekten. Ich gehe nun einmal davon aus, dass du eine Klasse File hast, die ein Property FirstLine besitzt.

Im ViewModel:

public YourViewModel()
{
  var data = CollectAllData();
  Files = new AvaloniaList<File>(data);
}

public AvaloniaList<File> Files { get; set; }

Hierbei kann man einmal davon ausgehen, dass du eine Methode CollectAllData hast, die alle Dateien in eine Liste liest. Diese Liste wird an eine AvaloniaList weitergegeben. Dies ist eine spezielle Liste, die über ihre Änderungen aufmerksam machen kann.

Zurück in der XAML könnte man nun eine ListBox kreieren, die an die Liste aus dem ViewModel gebunden wird.

<ListBox Items="{Binding Files}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Button Content="{Binding FirstLine}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Für die Items der ListBox wird ein Template festgelegt, welches bestimmt, dass jedes Item aus einem Button besteht.

Da die ListBox an die Files-Liste gebunden ist, wird jedem Listeneintrag ein Element aus der Liste zugeordnet. Daher wäre die Klasse File auch der Kontext für eine Bindung im DataTemplate. In diesem Kontext ist das Property FirstLine bekannt.

0
Palladin007  21.11.2021, 02:01
@FaTech
vom Thema Webentwicklung bin ich extra weg. Das wurde mir zu langweilig. Ich sehe mich eher im Software Bereich.

Jedem das seine. Web-Frontend ist auch nicht meins, aber von ASP.NET Core kann man sehr viel lernen.

Dadurch entstehen Programme, welche sehr großen Speicher verbrauchen, weil jedes seinen eigenen Browser mitbringt und am Ende hätte man es als Software lösen können mit weniger Speicher

Den Vorteil hier sehe ich aber eher darin, dass man eine Code-Basis über alles hat, inklusive Web. Für eine Firma, die für alle Ziele eine Software mit mindestens großen Überschneidungen hat, kann das ein Killer-Argument sein.
Bei Windows gäbe es aber noch die Edge-Runtime, die man mit der WebView2 nutzen kann. Diese Runtime kann man selber mit liefern, man kann aber auch eine Installation voraussetzen. Wie das bei anderen Betriebssystemen aussieht, weiß ich aber nicht, das müsste man natürlich noch prüfen.

Denn Visual Studio 22 ist raus und es läuft nicht.

Arbeiten sie denn daran? Mit VS2022 hat sich einiges geändert, weshalb die Entwicklung einer umfangreicheren Extension durchaus mal aufwändiger sein kann. Wäre natürlich auch denkbar, dass die Entwicklung ganz allgemein stockt, aber das wird man wohl im nächsten Jahr sehen müssen.

Aber ob MAUI die Zukunft wird, wird sich auch erst noch zeigen müssen. Auch hier haben sie wieder neue Wege erfunden, ob die sich bewähren können, wird sich zeigen. Ich habe kaum Erfahrung damit, habe aber viel im Source von MAUI gelesen und halte viele der Ideen für genial - wäre schön, wenn das gut funktioniert und sich durchsetzt.

Ich bin sehr interessiert in MAUI, aber meines Wissens nach, wurde das noch nicht released

Soweit ich weiß noch nicht, aber nutzen kann man es trotzdem.
Wobei ich aber auch dazu sagen muss, dass ich eine simple Windows-Anwendung bisher noch nicht ans Laufen bekommen habe - ich habe aber auch nicht sehr viel Arbeit rein gesteckt, kann gut sein, dass die Doku mein Problem beantwortet, hätte ich sie gelesen :D

ich werde jetzt auch mein Programm nicht extra umstellen, weil es ist nicht gerade sehr klein und dadurch wäre es ein Riesen Aufwand

Produktiv baut man sowas natürlich nicht um.
Privat kann das für dich aber einen enormen Lern-Effekt haben. So ein Umbau kann dir Architektur-Fehler, die Du eingebaut hast, zeigen und Du kommst auf Ideen, die man Probleme anders oder besser lösen kann.
Tatsächlich habe ich vermutlich am meisten bei genau solchen Umbauten gelernt.
Z.B. habe ich privat ein Modul eines aktuell produktiven Projektes neu angefangen, um zu sehen, ob ich die Probleme, die ich in meiner ersten Implementierung sehe, besser lösen kann, da fließen dann auch neue Ideen und Konzepte von mir mit ein.

0