WPF und StringFormat

  • WPF
  • .NET 5–6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MasterQ.

    WPF und StringFormat

    Moin,

    folgendes Konstrukt funktioniert bei mir nicht, will heißen, das vorgegebene Format wird ignoriert.

    XML-Quellcode

    1. <Label Content="{Binding Data.Datum, StringFormat={}{0:yyyy-MM-dd}}"/>


    Datum wird aus einer Datenbank ausgelesen und hat den Typ DateTime?. Gleiches gilt auch für double, double?, ...

    Warum wird StringFormat hier ignoriert? An anderer Stelle (s.u.) im Code funktionierts aber ich weiß nicht warum mal so mal so. Den einzigen Unterschied den ich sehe, ist mal Label und mal DataGridTextColumn

    XML-Quellcode

    1. <DataGridTextColumn Header="{x:Static p:Translate.Datum}" Binding="{Binding Content.Datum, StringFormat={}{0:yyyy-MM-dd}}"/>


    Ich kann das Gewünschte auch mit nem Converter erreichen, doch interessiert mich prinzipiell warum das hier nicht geht.

    Gruß

    MQ
    Hallo

    MasterQ schrieb:

    Warum wird StringFormat hier ignoriert?

    Schon mal in die Ausgabe geschaut, vermutlich werden dir hier Bindingfehler angezeigt.

    Du Bindest auf ein Nullable(Of DateTime). Ein Nullable of T hat erstmal zwei Eigenschaften HasValue und Value.
    Somit würde ich erstmal auf Value Binden.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ein guter Hinweis!

    Ich hatte bisher allerdings keine Bindungsfehler erhalten.

    Wenn ich jetzt auf Value binde, dann erhalte ich den Bindungsfehler, dass DateTime (ohne ?) kein Value hat. Es ist also so, dass Intelisense im XAML sagt Content.Datum wäre ein DateTime? und schlägt auch Value vor. Beim Ausführen wird gemeckert, dass Content.Datum ein DateTime wäre und kein Value hätte. ?? hmmmm ?(

    MasterQ schrieb:

    Wenn ich jetzt auf Value binde, dann erhalte ich den Bindungsfehler, dass DateTime (ohne ?) kein Value hat.

    Na ist deine Eigenschaft nun Nullable oder nicht?
    Muss du ja wissen, du hast die Klasse geschrieben oder? Auch wenn nicht, guck mal in die Definition.

    Wie wäre es wenn du die Klasse herzeigst, dann könnte man dir evtl. besser helfen. Ich weis nicht warum alle immer nur eine einzige Zeile (in diesem Fall sogar nur XAML).
    Unsere Glaskugeln sind oft in Reparatur, und durch Rohstoffmangel dauert diese etwas länger.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    sorry, mein Datentyp ist DateTime?, also nullable.

    C#-Quellcode

    1. public partial class DataEViewEntity
    2. {
    3. [Key]
    4. public int DatenEID { get; set; }
    5. public DateTime? Datum { get; set; }
    6. ...
    7. }


    Deshalb schlägt Intellisense ja auch die Eigenschaft Value vor. Warum beim Starten des Formulars zur Laufzeit dann plötzlich ein DateTime draus wird, kann ich nicht sagen und verwirrt mich. Ich habe keinen Plan, was da abgeht.

    XML-Quellcode

    1. <Label Content="{Binding Data.Datum.Value, StringFormat={}{0:yyyy-MM-dd}}" Style="{StaticResource LabelStyle}"/>


    Screenshot:



    Fehler 1 DateTime Value Label.Content Object Die Eigenschaft "Value" wurde im Objekt vom Typ "DateTime" nicht gefunden.

    Beides ist aus dem XAML Editor herauskopiert, während das Programm lief. Im Quellcode wird kein Fehler angezeigt und beim Verbleib des Cursors auf Datum wird als Type DateTime? angezeigt.


    Ideen?
    Hallo

    OK, ich habe jetzt nochmals nachgesehen. Nullable verwende ich mit Binding so gut wie nie, da die notwendigkeit so selten gegeben ist.
    Also, WPF macht das im Hintergrund mit einem integrierten Converter und konvertiert das Nullable zu einem DateTime.
    Bedeutet, so kann das nicht ohne weiteres verwendet werden.

    Probier mal bitte folgendes:

    XML-Quellcode

    1. <Label>
    2. <Label.Style>
    3. <Style TargetType="Label">
    4. <Setter Property="Content" Value="{Binding Path=Data.Datum, StringFormat={}{0:yyyy-MM-dd}}" />
    5. <Style.Triggers>
    6. <DataTrigger Binding="{Binding Data.Datum}" Value="{x:Static sys:DateTime.MinValue}">
    7. <Setter Property="Content" Value="NULL" />
    8. </DataTrigger>
    9. </Style.Triggers>
    10. </Style>
    11. </Label.Style>
    12. </Label>


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    nee, tut leider nicht.

    Das ganze ist aber ein Label-Ding. Wandle ich das Label in TextBox, dann wird StringFormat korrekt ausgeführt und es gibt auch keinen Huddel mit DateTime?.

    Das Element Label scheint damit für meine Zwecke nicht das geeignetste zu sein. Nun muss ich doch auf TextBox umsteigen und das Template dafür entsprechend umschreiben. Ich dachte, ich könnte das vermeiden.

    Danke für's Mitdenken.

    Grüßle

    MQ