Der Schlüssel DataTemplate wird ignoriert, wenn er mit x: Static angegeben wird

9

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.

    
Pavel Tupitsyn 18.10.2013, 14:59
quelle

2 Antworten

3
  

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)' "

    
Rohit Vats 22.10.2013, 20:10
quelle
1

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%     
Anatoly Nikolaev 18.10.2013 15:46
quelle

Tags und Links