Ich habe seltsames Verhalten bei DataTemplate-Schlüsseln festgestellt: Wenn DataType über x: Type angegeben ist und x: Key wird über x angegeben: Statische Referenz, x: Schlüssel wird ignoriert. Ich habe eine Beispiel-App geschrieben, um es zu veranschaulichen.
XAML-Ressourcen:
%Vor%C #:
%Vor%Starten Sie die Anwendung, siehe hierzu.Resources.Keys im Debugger:
%Vor%Wie Sie sehen, wird im ersten Fall x: Key ignoriert!
Kann jemand erklären, was vor sich geht? Die Dokumentation ( Ссылка ) sagt eindeutig, dass die Einstellung x: Key die Ressource setzt Schlüssel zu was auch immer Sie darin angeben.
Kurze Antwort auf Ihre Frage ist - JA, es ist ein Bug im WPF-Framework. Fehler gemeldet here .
Aktualisieren -
Microsoft hat akzeptiert, dass es sich um einen Fehler im XAML-Compiler handelt und beheben dieses Problem nicht. Zitat von Microsoft -
Dies ist ein Problem im XAML-Compiler - es erzeugt BAML zur Beschreibung der Schlüssel für jede Ressource, normalerweise basierend auf dem x: Schlüssel, wenn er vorhanden ist und auf dem DataType, wenn es nicht ist. Wenn x: Key selbst indirekt ist (in Wenn Sie x: Static verwenden, wählt der Compiler den Schlüssel DataType. Die Auswahl des x: Statisch-basierten Schlüssels ist wahrscheinlich "korrekter", Wenn Sie dies ändern, treten Kompatibilitätsprobleme auf. Auch weil die Problem tritt bei der Kompilierung auf, Sie müssten Ihre App neu kompilieren, um zu sehen das Update (um einen anderen BAML-Stream zu generieren). Bestehende Kopien Ihres App würde den alten BAML-Stream enthalten und würde sich genauso verhalten zur Laufzeit wie sie es jetzt tun. Aus diesem Grund entscheiden wir uns nicht zu werden behebe dieses Problem.
x: Schlüssel wird hier nicht ignoriert, aber im ersten Fall auf DataTemplateKey(WpfApplication1.TestDto)
gesetzt. Sie können keine Ressource im Abschnitt Ressourcen ohne einen Schlüsselwert deklarieren.
Wie Sie sehen können, wird der Schlüssel hier automatisch auf DataTemplateKey(WpfApplication1.TestDto)
gesetzt.
Von MSDN -
Diese Eigenschaft ähnelt der TargetType-Eigenschaft von Stilklasse Wenn Sie diese Eigenschaft auf den Datentyp ohne festlegen Geben Sie einen x: Key an, auf den das DataTemplate automatisch angewendet wird Datenobjekte dieses Typs. Beachten Sie, dass der x: Schlüssel gesetzt ist, wenn Sie das tun implizit. Wenn Sie diesem DataTemplate einen x: Key-Wert zuweisen, Sie überschreiben das implizite x: Key und das DataTemplate nicht automatisch angewendet werden.
Irgendwie, wenn Sie bind x:Key with static value
anstelle von hardcoding string haben, bekommt es defined as default template for that dataType
und daher wird key auf DataTemplateKey(WpfApplication1.TestDto)
gesetzt.
Dies können Sie überprüfen, indem Sie mit nur DataType-Satz, d. h.
, ein anderes DataTemplate zu Ihren Ressourcen hinzufügen <DataTemplate DataType="{x:Type wpfApplication1:TestDto}"/>
.
Es wird gut kompiliert, aber wird Laufzeitfehler
werfen"Artikel wurde bereits hinzugefügt. Schlüssel im Wörterbuch: 'DataTemplateKey (WpfApplication1.TestDto)' Schlüssel wird hinzugefügt: 'DataTemplateKey (WpfApplication1.TestDto)' "
Ich bin mir nicht sicher, dass das helfen wird, aber versuche, {get; set;} an jede Eigenschaft in deiner Klasse anzuhängen. Einige Mitarbeiter in WPF (d. H. Binding) funktionieren ohne sie nicht. Vielleicht ist hier die gleiche Geschichte ...
%Vor%