2009-07-21 9 views
5

Tengo un DataTemplate que estoy usando como el CellTemplate para un GridViewColumn.WPF no me deja poner un enlace en el camino de una encuadernación, ¿hay alguna otra manera?

Quiero escribir algo como esto para el DataTemplate:

<DataTemplate 
    x:Key="_myTemplate"> 
    <TextBlock 
     Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" /> 
</DataTemplate> 

Mi GridView está unido a un DataTable, y quiero que se unen a la columna de la DataTable cuyo nombre es igual a la cabecera de la GridViewColumn se adjunta el DataTemplate. [Espero que tenga sentido!]

Lamentablemente, esto no funciona. Obtengo una XamlParseException: "A 'Binding' no se puede establecer en la propiedad 'Path' del tipo 'Binding'. Un 'Binding' solo se puede establecer en una DependencyProperty de un DependenceyObject."

¿Cómo puedo configurar esto?

Editar (comentario de DanM a la pregunta elevando)

básicamente necesito un DataTemplate cuya unión se determina por el DataContext, y que la columna de la DataTemplate está conectada. ¿Hay una alternativa?

+0

No sé por qué ha etiquetado este RelativeSource como Silverlight no está soportada en Silverlight – AnthonyWJones

+0

Lo siento, Anthony. No sabía que Silverlight no era compatible con RelativeSource. Sin embargo, no estoy casado con el uso de RelativeSource, así que si hay una solución XAML para mi pregunta que no la usa, aún estaría interesado en escucharla. – devuxer

Respuesta

0

No se puede asignar un enlace a cualquier propiedad. La propiedad debe ser del tipo Binding o implementarse como Propiedad de dependencia en el objeto.

La propiedad Path de la clase Binding es del tipo PropertyPath y Binding no implementa la propiedad Path como una propiedad de dependencia. Por lo tanto, no puedes unir dinámicamente el Camino de la forma en que lo intentas.

Editar

Es, básicamente, se va a incrustar metadatos en su cota de datos que impulsa la configuración de la DataTemplate. Esto no se puede hacer solo en XAML. Necesitarías al menos algo de apoyo del código.

Me parece que el mejor enfoque sería usar un ViewModel. Eso hace que el enlace en el XAML sea sencillo y empuja esta decisión de "qué ligar con qué" al código del ViewModel.

+0

Gracias, pero mi pregunta es si hay otra forma de lograr mi objetivo usando XAML. Básicamente, necesito un DataTemplate cuyo enlace esté determinado por DataContext * y * a qué columna está asociado el DataTemplate. ¿Hay una alternativa? – devuxer

+0

@Anthony, Thx para su edición. Mi pregunta en realidad surgió de una discusión sobre cómo mostrar datos dinámicos en un GridView donde el número de columnas y las rutas de enlace asociadas no se conocen hasta que se consulta la base de datos en el tiempo de ejecución. Estoy usando MVVM y tengo un ViewModel, pero mi solución inicial fue generar DataTemplates dinámicamente en el código subyacente utilizando XamlReader.Load(). Esto fue rotundamente criticado como "no bueno" (ver http: // stackoverflow.com/questions/1156336/is-it-possible-to-configure-a-gridview-to-show-pivoted-data-using-static-xaml-if), de ahí mi intento de una DataTemplate más flexible. – devuxer

+1

@Anothony (continuación), mi DataContext está configurado en mi ViewModel, y ItemsSource de mi GridView está configurado en una propiedad de ViewModel (una DataTable), pero supongo que no entiendo cómo ViewModel puede resolver el problema de cómo asignar cada GridViewColumn a la columna DataTable correcta sin recurrir a XAML cargado dinámicamente. – devuxer

0

¿No solo quiere esto?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}} 
+0

Creo que lo que tiene aquí establecería que el cuadro de texto de cada celda en la columna sea el mismo que el encabezado. Lo que quiero es vincular el GridViewColumn a la DataColumn apropiada de una DataTable, donde los nombres de las columnas en la DataTable coinciden con el valor de encabezado de las GridViewColumns. Por lo tanto, si el encabezado de un GridViewColumn fuera "Columna3", esta columna se vincularía a la columna denominada "Columna3" en el DataTable. Espero que tenga sentido :) – devuxer

+0

Creo que tendrá problemas para hacerlo de la manera que lo intenta, ya que las GridViews se basan en filas, es decir, una celda es un elemento secundario o una fila, no una columna. Intente ver esta serie de publicaciones del Dr. WPF, podría ayudar a aclarar algo de confusión: http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx. Una regla básica para WPF, si estás tratando de usar algo de una manera que no fue diseñada, las cosas se pondrán increíblemente difíciles, pero generalmente tienen una manera fácil de hacerlo. Encontrar la manera fácil es la parte difícil ... –

+0

@Bryan ¡Voy a echar un vistazo, gracias! – devuxer

Cuestiones relacionadas