2013-10-18 10 views
9

Ich stieß auf seltsames Verhalten mit DataTemplate-Schlüsseln: Wenn DataType über x angegeben ist: Typ und x: Schlüssel wird angegeben über x: Statische Referenz, x: Schlüssel wird ignoriert. Ich habe eine Beispiel-App geschrieben, um es zu illustrieren.DataTemplate-Schlüssel wird ignoriert, wenn mit x angegeben: Static

XAML-Ressourcen:

<DataTemplate DataType="{x:Type wpfApplication1:TestDto}" x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey}" /> 
<DataTemplate x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey2}" /> 
<DataTemplate DataType="{x:Type wpfApplication1:TestDto}" x:Key="TestKey3" /> 
<DataTemplate DataType="wpfApplication1:TestDto" x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey4}" /> 

C#:

public class TestDto {} 

public static class DataKeys 
{ 
    public static string TestDtoKey = "TestKey"; 
    public static string TestDtoKey2 = "TestKey2"; 
    public static string TestDtoKey4 = "TestKey4"; 
} 

Anwendung starten, siehe this.Resources.Keys in Debugger:

{DataTemplateKey(WpfApplication1.TestDto)} object {System.Windows.DataTemplateKey} 
"TestKey2" object {string} 
"TestKey3" object {string} 
"TestKey4" object {string} 

Wie Sie im ersten Fall sehen x: Schlüssel wird ignoriert!

Kann jemand erklären, was vor sich geht? Die Dokumentation (http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx) besagt eindeutig, dass die Einstellung von x: Key den Ressourcenschlüssel auf das setzt, was Sie darin angeben.

+0

Sehr ähnlich wie der Fehler. Vielleicht sollten Sie versuchen, Feedback für connect.microsoft.com zu schreiben? –

Antwort

3

Kurze Antwort auf Ihre Frage ist - JA es ein Bug in WPF Rahmen ist. Fehler gemeldet here.

aktualisieren -

Microsoft hat akzeptiert, dass es einen Fehler in XAML-Compiler ist, und sie werden dieses Problem nicht beheben. Zitat von Microsoft -

Dies ist ein Problem in den XAML-Compiler - es BAML erzeugt den Schlüssel für jede Ressource zu beschreiben, in der Regel auf der Grundlage des x: Key, wenn es vorhanden ist und auf dem Datentyp, wenn es nicht ist. Wenn x: Key selbst indirekt ist (in Ihr Fall mit x: Static), wählt der Compiler den Schlüssel DataType. Während die Auswahl des x: Static-basierten Schlüssels wahrscheinlich "korrekter" ist, würde dies zu Kompatibilitätsproblemen führen. Da das Problem zur Kompilierungszeit auftritt, müssen Sie Ihre App neu kompilieren, um das Update zu sehen (um einen anderen BAML-Stream zu generieren). Existierende Kopien Ihrer App würden den alten BAML-Stream enthalten und würden sich zur Laufzeit genauso verhalten wie jetzt. Aus diesem Grund entscheiden wir uns, dieses Problem nicht zu beheben, sondern .

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 lassen. Wie Sie sehen können, wird der Schlüssel hier automatisch auf DataTemplateKey(WpfApplication1.TestDto) gesetzt.

Von MSDN -

Diese Eigenschaft, die auf die Target Eigenschaft der Stil Klasse sehr ähnlich ist.Wenn Sie diese Eigenschaft auf den Datentyp ohne mit einem x: Key festlegen, wird das DataTemplate automatisch auf Datenobjekte dieses Typs angewendet. Beachten Sie, dass der x: Key implizit auf gesetzt wird. Wenn Sie diesem DataTemplate einen x: Key-Wert zuweisen, , überschreiben Sie den impliziten x: Key, und das DataTemplate würde nicht automatisch zugewiesen werden.

Irgendwie, falls Sie bind x:Key with static value statt Hardcoding-String, wird es defined as default template for that dataType und damit bekommt Taste auf DataTemplateKey(WpfApplication1.TestDto).

Diese Sie durch Hinzufügen eines weiteren Datatemplate auf Ihre Ressourcen mit nur Datentyp überprüfen können, das heißt

<DataTemplate DataType="{x:Type wpfApplication1:TestDto}"/> gesetzt.

Es wird gut kompilieren aber Laufzeitfehler werfen

„Artikel wurde bereits hinzugefügt Key im Wörterbuch:. 'DataTemplateKey (WpfApplication1.TestDto)' Key hinzugefügt wird: ‚DataTemplateKey (WpfApplication1.TestDto) '"

+0

Nun, ich danke Ihnen für die Antwort, aber Sie haben nur dasselbe gesagt wie ich mit anderen Worten. –

+0

+1 für die Entsendung zu MS, ich war zu faul –

+0

Ja kurze Antwort auf Ihre Frage wird das ein Fehler sein. :) –

1

Ich bin nicht sicher, dass wird helfen, aber versuchen Sie, {Get; Set;} an jede Eigenschaft in Ihrer Klasse anhängen. Einige Mitarbeiter in WPF (d. H. Binding) funktionieren ohne sie nicht. hier sein kann, ist die gleiche Geschichte ...

public static class DataKeys 
{ 
    public static string TestDtoKey { get { return "TestKey"; } set; } 
    public static string TestDtoKey2 { get { return "TestKey2"; } set; } 
    public static string TestDtoKey4 { get { return "TestKey4"; } set; } 
} 
+0

Ich habe es versucht und, kein Wunder, es hilft nicht. x: Statisch funktioniert mit allen statischen Eigenschaften oder Feldern. –

+2

[offtop] Netter Nick :) [/ offtop] –

Verwandte Themen