Laden...

NULL in XAML?

Erstellt von HeinzTomato vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.392 Views
HeinzTomato Themenstarter:in
345 Beiträge seit 2005
vor 16 Jahren
NULL in XAML?

Sollte eigentlich was simples sein, nur googlet es sich so schlecht nach "null".

Meine Frage ist einfach: Wie übergebe ich ein NULL in einer XAML-Datei. Beispiel:

<ObjectDataProvider ObjectType="{x:Type gs:csXAMLParams}" x:Key="globalParams">
  <ObjectDataProvider.ConstructorParameters>
    <gs:DBTypes>All</gs:DBTypes>  <!-- Datenbanktyp  -->
    <system:String>LogMode</system:String>
    <system:String>NULL</system:String>
  </ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

Nun hat der zweite Stringparameter den Wert "NULL" (also den String), ich möchte aber stattdessen ein echtes NULL übergeben. Wie?

Vermutlich dämlichst einfach, aber ich finde einfach die Lösung nicht.

Mein Haus, mein Viertel, mein Blog

U
1.688 Beiträge seit 2007
vor 16 Jahren

Null ist in diesem Fall tatsächlich "Null", einen String macht erst der XAML Parser daraus.
Ersetze demnach die Zeile 5 durch
<x:Null />

6.862 Beiträge seit 2003
vor 16 Jahren

Vielleicht noch zur Ergänzung: Realisiert ist das durch die NullExtension, eine Markup Extension. Gut zu wissen deshalb, da man nicht immer diese Objektschreibweise als Tag benutzen kann, sondern oft auch Attribute hat, und die schreibt man dann so:

<meinTag meinAttribut="{x:Null}" />

Baka wa shinanakya naoranai.

Mein XING Profil.

U
1.688 Beiträge seit 2007
vor 16 Jahren

In diesem Zusammenhang erinnere ich mich an eine ähnliche Frage. Wie kann ich einen leeren String (String.Empty) in XAML kodieren?
Möchte ich bspw. einen String als Resource speichern, würde ich das so machen:


 <Grid.Resources>
   <clr:String x:Key="test">test</clr:String>
 </Grid.Resources>

Versuche ich dann einen leeren String in Analogie zu kodieren


 <Grid.Resources>
   <clr:String x:Key="EmptyString" />
   <!-- oder auch so: -->
   <clr:String x:Key="EmptyString2" ></clr:String>
 </Grid.Resources>

bekomme ich eine Exception des XAML-Parsers (Cannot create instance of String).
Interessanterweise ist das allerdings genau die Variante, in der der XAMLWriter einen leeren String abspeichert, wenn man ihn über Grid.Resources.Add hinzufügt. Das sieht so aus:


 <Grid.Resources>
   <clr:String x:Key="EmptyString2" xml:space="preserve" />
 </Grid.Resources>

Das Einlesen der durch "XAML selbst" gespeicherten Datei geht wieder schief. Also eine Inkonsistenz?

Ich habe noch VS2005 Pro, mit .NET 3.5 und den WPF Erweiterungen für VS2005. Funktioniert das mit VS2008 richtig?

6.862 Beiträge seit 2003
vor 16 Jahren

Also das


 <Grid.Resources>
   <clr:String x:Key="EmptyString" />
   <!-- oder auch so: -->
   <clr:String x:Key="EmptyString2" ></clr:String>
 </Grid.Resources>

schluckt zwar der Compiler, aber zur Laufzeit gibts berechtigterweise eine Exception. Mit XAML erstellt man immer Objekte des entsprechenden Typs, und hier wird versucht den Standardkonstruktor aufzurufen da keine Werte übergeben werden und da es keinen Standardkonstruktor gibt, krachts halt.

Mir ist keine Möglichkeit bekannt einen leeren String als Resource anzulegen, aber es ist leicht einen leeren String zuzuweisen, z.B.:

<Label Content="{x:Static clr:String.Empty}" />

Interessanterweise ist das allerdings genau die Variante, in der der XAMLWriter einen leeren String abspeichert, wenn man ihn über Grid.Resources.Add hinzufügt

Schau dir mal an wie andere Klassen gespeichert werden. Genauso. Was bleibt dem Writer auch anderes übrig. Er kann ja net wissen wie die Klasse aufgebaut ist, welche Werte von Interesse sind etc. gerade da in den Resourcen ja alles mögliche gespeichert werden kann.

Da kommen jetzt wieder DependencyProperties ins Spiel. Die werden nämlich richtig gepspeichert, weil der damit mehr anfangen kann. Generell werden durch XAML alle Klassen behandelt als haben sie einen Standardkonstruktor und dann werden die angegebenen Dependency Properties gesetzt. Von dem Schema sollte man auch nicht abweichen.

Baka wa shinanakya naoranai.

Mein XING Profil.

U
1.688 Beiträge seit 2007
vor 16 Jahren

Danke für die Info. Dass der Standardkonstruktor verwendet wird, war mir nicht ganz bewusst gewesen.Das erklärt natürlich das Verhalten.

Mit {x:Static} hatte ich auch schon in den Resourcen experimentiert, aber keinen Weg gefunden - wie auch, da der String ja vom Inhalt und nicht vom Attribut initialisiert wird und im Inhalt die XAML Erweiterungen nicht angewandt werden.