2009-12-23 14 views
11

Tengo un DataTemplate que quiero encontrar usando el FrameworkElement.FindResource(). Para hacer eso, necesito tener una clave en la plantilla de datos.WPF DataTemplate - x: clave vs DataType = "{x: tipo XXXX")

El problema es que la tecla x: y la asignación de un tipo de datos son mutuamente excluyentes. (Reference)

Entonces, una vez que configuro el tipo de datos para mi plantilla, ¿cómo puedo encontrar el valor clave? ¿Hay alguna fórmula que convierta DataTemplate en una cadena para la clave?

(Para inquries de por qué necesito para obtener el DataTemplate encontrado por Recursos ver este question

Respuesta

19

La x:.. Clave parece ser un objeto de tipo System.Windows.DataTemplateKey lo tanto, puede "crear" la clave para . el recurso con new DataTemplateKey(typeof(myType))FindResource funcionará con esta clave, ya que se ha anulado TemplateKey.Equals

Aquí es una aplicación muy simple ejemplo:.

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

Esto se ve muy bien, pero es una solución de C#. ¿Hay alguna forma de hacer esto desde XAML directamente? Por ejemplo, tengo una plantilla de tipo de datos que estoy usando en todas partes, pero también quiero usarla como valor en un TemplateSelector. Lo mismo ... si agrego una clave, pierdo la coincidencia de tipo de datos. Si no lo hago, no estoy seguro de cómo ref en XAML. – MarqueIV

+1

@MarqueIV: Debería poder hacer referencia a él en XAML usando '{x: Type ...}' como la clave. – Heinzi

+0

Probé esto ... DataTemplate = "{StaticResource {x: Type vm: IOPBase}}" pero no funciona. Bloqueos. (Para su información, sé que el tipo es correcto ya que la plantilla tiene 'DataType = "{x: Type vm: IOPBase}"' que funciona bien.) ¿Pensamientos? – MarqueIV