c# - two - Enlace WPF a DataContext padre
wpf binding types (2)
Debido a cosas como esta, como regla general, trato de evitar la mayor parte del "engaño" de XAML y mantengo el XAML tan tonto y simple como sea posible y hago el resto en el ViewModel (o propiedades adjuntas o Conversores de valores de IV, etc.) si es realmente necesario).
Si es posible, le daría al ViewModel del DataContext actual una referencia (es decir, una propiedad) al ViewModel principal relevante
public class ThisViewModel : ViewModelBase
{
TypeOfAncestorViewModel Parent { get; set; }
}
y atar contra eso directamente en su lugar.
<TextBox Text="{Binding Parent}" />
Tenemos una aplicación WPF con un patrón MVVM estándar, que utiliza Cinch (y por lo tanto MefedMVVM) para la resolución de View -> ViewModel. Esto funciona bien, y puedo vincular los controles relevantes a las propiedades en ViewModel.
Dentro de una Vista particular, tenemos un XamGrid Infragistics. Esta cuadrícula está vinculada a un ObservableCollection en el ViewModel y muestra las filas apropiadas. Sin embargo, luego tengo una columna específica en esta cuadrícula en la que estoy tratando de vincular un valor de texto de TextBox a una propiedad en el DataContext principal, en lugar de la colección Observable. Este enlace está fallando.
Hemos pasado por varias opciones aquí, incluyendo:
Usando AncestorType para rastrear el árbol y enlazarlo al DataContext del UserControl principal como así (de la gran respuesta a esta pregunta, así como a esta ) ...
{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
Especificando el ElementName e intentando apuntar directamente al control de nivel superior. Eche un vistazo aquí si desea leer sobre el uso de ElementName.
Utilizando un ''proxy'' FrameorkElement definido en los recursos para que el UserControl intente y "pase" el contexto según sea necesario. Definimos el elemento como se muestra a continuación, luego hacemos referencia como un recurso estático ...
<FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>
En este caso, el enlace encuentra FrameworkElement, pero no puede acceder a nada más allá de eso (al especificar una ruta).
Después de leer alrededor, parece bastante probable que esto sea causado por las columnas de construcción Infragistics XamGrid fuera del árbol. Sin embargo, incluso si este es el caso, al menos las opciones 2 o 3 deberían funcionar.
Nuestros últimos pensamientos son que está relacionado con el enlace V - VM, pero incluso con Snoop aún no hemos encontrado cuál es el problema exacto. De ninguna manera soy un experto con WPF vinculante, por lo que cualquier puntero sería apreciado.
EDITAR: He encontrado algunos ejemplos de plantillas de Infragistics here que intentaré.
EDIT 2: como lo señaló @Dtex, las plantillas son el camino a seguir. Aquí está el fragmento relevante para usar con un XamGrid:
<ig:GroupColumn Key="CurrentDate">
<ig:GroupColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</DataTemplate>
</ig:GroupColumn.HeaderTemplate>
<ig:GroupColumn.Columns>
He dejado abierto el XML ... simplemente agregaría las columnas que deseaba, luego cerraría las etiquetas relevantes.
No sé sobre XamGrid
pero eso es lo que haré con un DataGrid
estándar de wpf:
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Dado que el TextBlock
y el TextBox
especificados en las plantillas de celdas formarán parte del árbol visual, puedes acercarte y encontrar el control que necesites.