2009-12-23 15 views
11

Ho un DataTemplate che voglio trovare utilizzando lo FrameworkElement.FindResource(). Per farlo ho bisogno di avere una chiave sul modello di dati.WPF DataTemplate - x: Key vs DataType = "{x: Type XXXX")

Il problema è che x: la chiave e l'assegnazione di un tipo di dati si escludono a vicenda. (Reference)

Quindi, una volta impostato DataType per il mio modello, come trovo il valore Chiave? Esiste una formula che converta DataTemplate in una stringa per la chiave?

(Per inquries sul motivo per cui ho bisogno di ottenere il DataTemplate trovato da Resource vedere questo question

risposta

19

La x:.. Chiave sembra essere un oggetto di tipo System.Windows.DataTemplateKey Quindi, è possibile "creare" la chiave per . la vostra risorsa con new DataTemplateKey(typeof(myType))FindResource funzionerà con questa chiave, dal momento che è stato ignorato TemplateKey.Equals

Ecco un'applicazione molto semplice esempio:.

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

Questo sembra grande, ma è una soluzione di C#. C'è un modo per farlo direttamente da XAML? Ad esempio, ho un modello DataType che sto usando ovunque, ma voglio anche usarlo come valore in TemplateSelector. Stessa cosa ... se aggiungo una chiave, perdo la corrispondenza del tipo di dati. Se non lo faccio, non sono sicuro di come rifarlo in XAML. – MarqueIV

+1

@MarqueIV: dovresti poterlo fare riferimento in XAML usando '{x: Type ...}' come chiave. – Heinzi

+0

Provato questo ... DataTemplate = "{StaticResource {x: Type vm: IOPBase}}" ma non funziona. Blocca. (FYI, so che il tipo è corretto in quanto il modello ha 'DataType = "{x: Type vm: IOPBase}"' che funziona bene.) Pensieri? – MarqueIV

Problemi correlati