2009-12-23 2 views
11

Ich habe eine DataTemplate, die ich mit der FrameworkElement.FindResource() finden möchte. Dazu muss ich einen Schlüssel in der Datenvorlage haben.WPF DataTemplate - x: Taste vs DataType = "{x: Type XXXX")

Das Problem ist, dass sich x: key und das Zuweisen eines Datentyps gegenseitig ausschließen. (Reference)

Also, sobald ich den DataType für meine Vorlage festlegen, wie finde ich den Key-Wert? Gibt es eine Formel, die das DataTemplate in eine Zeichenfolge für den Schlüssel konvertiert?

(Für inquries, warum ich brauche die Datatemplate von Resource sehen diese question gefunden zu bekommen

Antwort

19

Der x:.. Key scheint System.Windows.DataTemplateKey ein Objekt vom Typ zu sein, so können Sie „schaffen“ den Schlüssel für . Ihre Ressource mit new DataTemplateKey(typeof(myType))FindResource werden mit diesem Schlüssel arbeiten, da TemplateKey.Equals überschrieben wurde

Hier ist ein sehr einfaches Beispiel Anwendung:.

XAML:

<Window ...> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type TextBlock}"> 
     </DataTemplate> 
    </Window.Resources> 

    <Button Click="Button_Click">Test</Button> 
</Window> 

Codebehind:

//using ... 

namespace WpfCsApplication1 { 
    public partial class Window1 : Window { 
     public Window1() { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) { 
      var key = new System.Windows.DataTemplateKey(typeof(TextBlock)); 
      var r = (DataTemplate)this.FindResource(key); 

      MessageBox.Show(r.ToString()); // to show that it worked 
     } 
    } 
} 
+0

Das sieht gut aus, sondern ist eine C# Lösung. Gibt es eine Möglichkeit, dies direkt von XAML aus zu tun? Ich habe zum Beispiel eine DataType-Vorlage, die ich überall verwende, aber ich möchte sie auch als Wert in einem TemplateSelector verwenden. Das Gleiche ... wenn ich einen Schlüssel hinzufüge, verliere ich die Übereinstimmung des Datentyps. Wenn nicht, bin ich mir nicht sicher, wie ich es in XAML referenzieren könnte. – MarqueIV

+1

@MarqueIV: Sie sollten in XAML verweisen können, indem Sie '{x: Type ...}' als Schlüssel verwenden. – Heinzi

+0

Erprobt dies ... DataTemplate = "{StaticResource {x: Geben Sie vm: IOPBase}}", aber es funktioniert nicht. Stürzt ab. (Zu Ihrer Information, ich weiß, dass der Typ korrekt ist, da die Vorlage 'DataType = "{x: Type vm: IOPBase}"' hat, was gut funktioniert.) Gedanken? – MarqueIV