Ich habe diese Markup-ErweiterungAngeben DataTemplate.DataType mit einer benutzerdefinierten Typ Erweiterung
public class NullableExtension : TypeExtension
{
public NullableExtension() {
}
public NullableExtension(string type)
: base(type) {
}
public NullableExtension(Type type)
: base(type) {
}
public override object ProvideValue(IServiceProvider serviceProvider) {
Type basis = (Type)base.ProvideValue(serviceProvider);
return typeof(Nullable<>).MakeGenericType(basis);
}
}
, die eine Nullable-Version eines anderen Typs zu schaffen, ausgelegt ist. Es funktioniert wie erwartet, wenn es in "normalem" XAML verwendet wird. Zum Beispiel, wie in
<SomeControl DataContext="{My:Nullable System:Int32}"/>
(unter der Annahme, dass Ihr das XML-Namespace für den C# Namespace Halten der Erweiterung und in ähnlicher Weise für System definiert ist). Der Datenkontext für das Steuerelement wird wie erwartet auf System.Type
für Nullable<int>
gesetzt.
Allerdings, wenn ich diese Erweiterung verwenden, um zu versuchen, und stellen Sie die DataType
Eigenschaft eines DataTemplate
wie
<DataTemplate DataType="{My:Nullable System:Int32}">
<TextBlock ... />
</DataTemplate>
mir gesagt wurde, durch den Compiler, dass
Ein Schlüssel für ein Wörterbuch kann nicht vom Typ 'System.Windows.Controls.Primitives.TextBlock' sein. Nur String, TypeExtension und StaticExtension unterstützt werden. "
und
" Nein Konstruktor für Typ 'NullableExtension' hat 1 Parameter.
Weiß jemand, warum nur diese drei Methoden (und nicht einmal Unterklassen von TypeExtension
, wie meins ist) erlaubt sind? Was ist das Besondere an der Verarbeitung des XAML an diesem Punkt? Und gibt es eine andere Möglichkeit, dies zu erreichen (Datenvorlagenauswahl basierend auf Typen, die Nullwerte enthalten können), ohne auf DataTemplateSelector
zurückzugreifen?
Danke. Ich weiß, dass es gefährlich sein könnte, aber ich würde meinen, dass es möglich wäre, den Typ des Wertes zu validieren, der DataType zugewiesen wurde, nämlich ein System.Type. Ich versuche nicht, DataType einen beliebigen Wert zuzuweisen, sondern nur einen Type. Interessant über den BAML-Parser. Wie für das Boxen Problem, das ist ein guter Punkt, obwohl in dem Fall, den ich habe, werde ich explizit eine Nullable eher als einen verpackten Wert und haben andere Gerüste an Ort und Stelle, um das "das Richtige tun" für meine Bedürfnisse. Sieht so aus, als müsste ich mit einem Workaround fortfahren. Danke für die Hilfe. –
Ugh, ich vergesse immer, dass Kommentare hier keine extra Zeilenumbrüche enthalten. Sorry das oben Formatieren ist so eklig. –
Die Dinge haben sich offensichtlich seit dem geschrieben, und während es aussieht wie 'DataType = "{x: Type TypeName = System: Nullable \' 1 [[System.Int32]]} "sollte im August 2013 unter funktionieren. NET 4.0, tut es nicht. Der einzige Weg, um dies zu umgehen, ist eine Art MarkupExtension. – Dan