CountryChooser(per flag)

  • WPF

Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True,Type={x:Type local:MainViewModel}

    Damit legst du nur den Context zur Designzeit fest damit du auch beim Binding Intellisense hast. Dies hat nichts mit dem Context für die Laufzeit zu tun.
    Diesen kann man in der Tat so setzen. Eine von mehreren Möglichkeiten.

    XML-Quellcode

    1. <Window.DataContext>
    2. <local:MainViewModel/>
    3. </Window.DataContext>​
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    So sorry für die Verspätung @ErfinderDesRades anbei das bereinigte Projekt,

    LG und Danke, schuld dir wohl, langsam mindestens nen Kaffee =)
    Dateien
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Jo, hab ich mal ein bischen zusammengeschrumpelt - am schwersten hats das MainViewmodel getroffen:

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Public Class MainViewModel
    3. Inherits BaseViewModel
    4. Public Shared ReadOnly Instance As New MainViewModel
    5. Private __AvailableCountries As ObservableCollection(Of CountryViewModel) = CountryViewModel.Seed
    6. Public WithEvents AvailableCountries As New ListCollectionView(__AvailableCountries) ' enables access/observe the currently selected Person
    7. Public Sub New()
    8. AvailableCountries.MoveCurrentToFirst()
    9. End Sub
    10. Public ReadOnly Property TheCommand As New RelayCommand(AddressOf DoCommand_Execute, Function(o) AvailableCountries.CurrentItem IsNot Nothing)
    11. Private Sub DoCommand_Execute(obj As Object)
    12. Dim land = __AvailableCountries(AvailableCountries.CurrentPosition)
    13. MessageBox.Show($"Land: {land.CountryName}, IVNLanguage: {land.CountryIVNLanguage}")
    14. End Sub
    15. End Class
    (achja - und das Command habich nun auch angeschlossen.)
    Das BaseViewmodel hingegen habich aufgeblasen - das überprüft jetzt (zur Entwicklungs-Zeit), ob die angegebenen Properties auch gültig sind.
    Ausserdem unterlässt es RaisePropertyChanged, wenn die Property sich garnet geändert hat.
    Und man kann mehrere Props in einem Aufruf changen, und so Kram halt.

    Dein Hauptproblem war, dass du die Image-Uris nicht richtig konstruiert hattest. Die Uri-Syntax ist aber auch wirklich extrem unintuitiv - das muss man erstmal recherchieren und dann immer wieder nachlesen.
    Dateien
    Grüße dich @ErfinderDesRades

    Leider bin ich heute nicht im HomeOffice, sondern im Büro, weshalb ich erst später detailliert auf dein Projekt antworten kann, aber was ich bisher sagen kann: WoW ! Mit wie wenig Code das alles machbar ist, und wie viel angenehmer das alles lesbar ist, ich bin echt baff.

    Ich hab mir auch schon im Code mit Kommentaren fragen dazu notiert, die ich dir dazu noch stellen möchte, nur ist es mir erst abends möglich, da wir aktuell viel Stress im Büro haben.

    Danke dir schon mal vielmals =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    So jetzt hab ich endlich etwas Zeit ^^


    Dass du das Command angeschlossen hast, ist cool, das war nur ein Überbleibsel, als ich noch einen Button verwendet habe, um das gewählte Land anzuzeigen, danach hab ich ja direkt die Flagge anzeigen lassen, was mir gleich aufgefallen ist, ist das deine Schreibweise DEUTLICH kürzer ist, gibt es eine dir bekannte Quelle wo man lernen kann wie diese, ich nenne Sie mal verschachtelten Funktionen funktionieren?

    Im MainWindow und im CountrySingleView, hast du nach dem Binding an die AvailableCountries einen Slash, wofür ist der denn da?

    Was die Uri´s zu den Images angeht... WTF wer kommt den auf so etwas derart abstraktes und kompliziertes, da kommt doch von selbst echt kein Mensch drauf, danke dir hier vielmals! Gibt es eine Quelle wo ich das Thema besser kennenlernen könnte?

    ListCollectionView ist auf jeden Fall ein Thema, in dem ich mich auch noch einlesen muss, das kannte ich noch gar nicht.

    Und zu guter Letzt bin ich noch etwas verwirrt in Bezug auf die Funktion des DoCommands, da steht:

    Dim land = __AvailableCountries(AvailableCountries.CurrentPosition) aber sollte man nicht immer angeben, als was man Dimt ? Diese Schreibweise ist mir bislang unbekannt und kommt mit OptionStrictOn im Gedächtnis betrachtend komisch vor, gibt es dazu auch dir bekannte Quellen die das näher erklären?


    LG und danke dir nochmals @ErfinderDesRades
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    Was die Uri´s zu den Images angeht


    Ich habe jetzt nicht ins Project geschaut, aber vielleicht sowas!?

    docs.microsoft.com/en-us/dotne…p-4.8#The_Pack_URI_Scheme
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    asusdk schrieb:

    gibt es eine dir bekannte Quelle wo man lernen kann wie diese, ich nenne Sie mal verschachtelten Funktionen funktionieren?
    das sind anonyme Methoden.
    Unter dem Begriff wird sich was finden lassen.
    Vielleicht auch ein gut Buch. Die neueren Löffelmann-Bücher kenne ich nicht sonderlich gut, aber sollen wohl Kapitel zu enthalten.
    Die gabs auch mal für lau.
    Oder Kühnel/Leibhard.

    asusdk schrieb:

    Im MainWindow und im CountrySingleView, hast du nach dem Binding an die AvailableCountries einen Slash, wofür ist der denn da?
    der bezeichnet das aktuell ausgewählte Element.
    Wird dir aber auch angezeigt, wenn du ein Binding mit Binding-Picking anlegst/änderst.

    asusdk schrieb:

    Was die Uri´s zu den Images angeht... WTF wer kommt den auf so etwas derart abstraktes und kompliziertes, da kommt doch von selbst echt kein Mensch drauf
    Ich war's nicht.
    googel "packed uri"

    asusdk schrieb:

    ListCollectionView ist auf jeden Fall ein Thema, in dem ich mich auch noch einlesen muss, das kannte ich noch gar nicht.
    ListCollectionView ist die Wpf-Entsprechung von was in WinForms eine BindingSource ist.
    Abstrakt formuliert: Eine View auf eine Datenmenge, und zusätzlich ein CurrencyManager (also ein Dingens, was sich den aktuell ausgewählten Datensatz merkt)

    asusdk schrieb:

    Dim land = __AvailableCountries(AvailableCountries.CurrentPosition) aber sollte man nicht immer angeben, als was man Dimt ? Diese Schreibweise ist mir bislang unbekannt
    Das ist eine Kompilier-Option, die ich sehr empfehle: Option Infer On
    Der Compiler weis doch sowieso, welchen Datentyp der Ausdruck hat, den du einer Variablen zuweist. Bei Infer On fasst er diese Zuweisung dann gleich als Deklaration auf, und du kannst dir sparen, den Datentyp (den er sowieso weiss) nochmal hinzuschreiben (und dich dabei womöglich noch zu vertun).
    Ist insbesondere praktisch, wenn man den Datentyp austauschen will, etwa wenn man statt double decimal haben will oder statt eines Arrays eine List(Of T) und sowas. Das gewünschte zuweisen, und der Datentyp ist geändert.

    Aber immer feste die Begriffe recherchieren und mit rumprobieren...
    das sind anonyme Methoden.

    Aber immer feste die Begriffe recherchieren und mit rumprobieren...


    Ja das mach ich an sich sogar sehr gerne, aber oft sieht man Codeteile wie hier eben die anonyme Methode und weiß gar nicht, welchen begriff man sucht, ich hab solche Probleme sehr häufig, ich weiß, was ich wissen will, aber da ich nicht weiß, um was es sich handelt, weiß ich nicht wie ich danach suchen kann.

    Jetzt hab ich ja erstmal ein paar Sachen zum Einlesen =)

    @Akanel
    ​Ich habe jetzt nicht ins Project geschaut, aber vielleicht sowas!?

    Jaa, das ist ein richtig guter link, dann kann man nicht nur versuchen das zu benutzen, sondern direkt erstmal verstehen was genau da eigentlich abgeht, danke dir!
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „asusdk“ ()

    Jetzt muss ich glatt nochmal fragen, wie bekommt man denn eine URI in einen normalen Filepath umgewandelt ?

    Ich verwende in meinem Programm ja 3 Textdokumente, die hab ich jetzt mit ins Projekt eingebunden und will diese auch verwenden, aber z.B. Io.File.Exists funktioniert ja nur mit einem richtigen Pfad, weis evtl. jemand wie man das Convertiert ? Ich hab schon gegoogelt aber wie leider üblich nichts dazu gefunden

    Nachtrag, gilt ja ebenso für FileReadAlltext und dergleichern.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „asusdk“ ()

    @Akanel Leider nein, ich bräuchte es ja wenn dann genau andersrum. Ich habe eine von diesen unendlich abstrakten WPF-Uris.
    "New Uri($"pack://application:,,,/Advanced Invoice Helper;component/Assets/Textpresets/Germany IVT", UriKind.RelativeOrAbsolute)"
    Und müsste das in einen Normalen Filepath convertieren in diesem falle:

    "E:\Programmieren\Visual\Ab 10-03-21\Advanced Invoice Helper\Advanced Invoice Helper\Assets\Textpresets\Germany IVT"

    Mit Uri.Localpath erhalte ich jedoch:


    Und mit Uri.AbolutePath leider nur:


    Dabei müsste doch wenn alles passt in der "tmp_IVNLanguage" der korrekte Pfad zur Datei stehen, nur komm ich nicht dahinter wie

    Muss ich hier wieder auf Designtimesupport verzichten und wieder absolute Pfade verwenden anstelle von Uris ? Wäre echt schade, kann doch nicht sein das sich die WPF bei jedem Pfifkaas wieder unterschiedlich verhält und man wieder auf alte Wege zurückgreifen muss damit die Programme mal laufen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „asusdk“ ()

    Ja ich hab schon etwas in der Art vermutet, aber ich finde nicht den kleinsten Ansatz auf Google zu dem Thema, und ich begreife bisher nicht ganz wie diese Uris aufgebaut sind, und ich vermute das man die erstmal vollständig verstehen muss bevor man sich anmaßen kann einen Konverter zu schreiben.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    ich begreife bisher nicht ganz wie diese Uris aufgebaut sind

    Nanu?

    asusdk schrieb:

    Jaa, das ist ein richtig guter link, dann kann man nicht nur versuchen das zu benutzen, sondern direkt erstmal verstehen was genau da eigentlich abgeht, danke dir!
    Da war ich doch beeindruckt, dass du verstehst, wie der Kram aufgebaut ist - weil ich hab mit dem Artikel so meine Mühe.

    Wie dem auch sei - es wird ein bischen ein Parser werden müssen, der Uri-Grammatik.
    Etwa wenn da steht pack:application... dann wird das wohl iwie relativ zu Application.EntryAssembly.Directory sein oder sowas.
    Und ja - einen 100% featurecomplete, bugfree Uri-Parser wirste wohl nicht hinkriegen.
    Nein nein, ganz verstanden hab ich es nicht, nur das es sich nicht um gänzlich kryptische angaben handelt, ich werd mir den Artikel nochmal anschauen und les mich mal im Thema Parser ein, danke schonmal für den Tipp
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Ich versteh gerade nicht wieso du das Konvertieren musst? Wenn du doch die Flaggenbildchen als .png in deinem Programm im Assets Ordner hast kannst du die URI nutzen. Was machst du denn noch damit das du einen Filepath brauchst?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    asusdk schrieb:

    les mich mal im Thema Parser ein
    Das ist glaub zu kompliziert gedacht.
    Du musst iwas basteln, was den uri ausliest, und unterschiedlich reagiert, wenn da "pack" steht oder nicht. oder "application". oder "component" und so kram.
    Ich denke nicht, dass du iwo im Internet bei Lektüre zum Thema "parser" dazu iwelche nützlichen Hinweise findest.

    Also "Parser" nur im ganz allgemeinen Sinne: Ein Dingens, was iwas ausliest, "versteht", und ein Ergebnis fabriziert.

    Akanel schrieb:

    Ich versteh gerade nicht wieso du das Konvertieren musst? Wenn du doch die Flaggenbildchen als .png in deinem Programm im Assets Ordner hast kannst du die URI nutzen. Was machst du denn noch damit das du einen Filepath brauchst?


    Ne in dem Fall ginge es um Textdateien, diese müssen damit sie bearbeitet und auch ausgelesen werden können als physische Dateien vorliegen, und wie könnte ich die jetzt auslesen anhand der URI, denn IO.File.ReadAllText funktioniert auch nicht mit einer URI


    @ErfinderDesRades Ich hab nun als Zwischenlösung einen StreamReader ins Spiel gebracht

    VB.NET-Quellcode

    1. Private Shared Function UriToText(ByVal TextUri As Uri) As String
    2. Dim ResStream = Application.GetResourceStream(TextUri)
    3. Dim ResStreamText = String.Empty
    4. Using Reader As New IO.StreamReader(ResStream.Stream)
    5. ResStreamText = Reader.ReadToEnd
    6. End Using
    7. Return ResStreamText
    8. End Function


    Aber wie stehen die Chancen, dass ich die Textdatei so, noch, nach Kompilierung verändern kann? Ist das überhaupt möglich? Oder fällt dir generell eine elegantere Methode ein, wie ich quasi 3 verschiedene Texte, bearbeitbar zur Verfügung haben kann? welche ich für das setzen in die Zwischenablage auch jederzeit auslesen können und vorher bestimmte Teile des Textes ersetzten können muss ? Mach ich mir vermutlich gerade nur wieder komplizierter als nötig weil ich nicht weiss welche möglichkeiten da evtl. sinnvoller genutzt wären.

    LG und Danke
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „asusdk“ ()