2008-11-12 15 views
7

Estoy intentando vincular DependancyProperty en uno de mis controles de usuario a la propiedad Width de Column en un Grid.Encuadernación WPF a ancho de columna de cuadrícula

I tienen un código similar a esto:

<Grid x:Name="MyGridName"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="TitleSection" Width="100" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions>...</Grid.RowDefinitions> 

    <GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... /> 
</Grid> 

En un Usercontrol separada Tengo el siguiente DependancyProperty definido.

public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl)); 

public int TitleWidth 
{ 
    get { return (int)base.GetValue(TitleWidthProperty); } 
    set { base.SetValue(TitleWidthProperty, value); } 
} 

estoy creando instancias de la Usercontrol en el código, por lo tanto, tengo una declaración de unión similar a esto:

MyUserControl Cntrl = new MyUserControl(/* Construction Params */); 
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay }); 
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay }); 
/* Other operations on Cntrl */ 

la primera unión de obras definidas fantásticamente, aunque eso es unirse a un UIElement real (en este caso, un control deslizante), pero el enlace a "TítuloSección" (que es la definición de columna definida en la cuadrícula) falla. Poner un punto de interrupción en el código y hacer un seguimiento en "TitleSection" devuelve el objeto esperado.

Estoy empezando a sospechar que no se puede vincular una x: Name'd ColumnDefinition. ¿Alguien puede sugerir cómo podría vincularme al ancho variable de la primera columna de mi grilla?

editar # 1 - Para responder a los comentarios

El enlace de datos 'falla' en el sentido de que con un punto de corte establecido en el definidor de la propiedad TitleWidth, y con el mando a GridSplitter cambiar el tamaño de la primera columna, el punto de inflexión nunca es golpeado. Además, el código I esperaría ser despedido cuando los cambios de DependancyProperty TitleWidth no se ejecutan.

El control de usuario se está creando y agregando a un panel de pila dentro de la cuadrícula en la función Window_Loaded. Esperaría que la cuadrícula se haya procesado para cuando se construyan los controles de usuario. Ciertamente, el x: Name'd Element TitleSection se puede ver y tiene un valor de 100 cuando se están construyendo/antes de que se produzca la unión.

EDIT # 2 - Posiblemente algo que ver con esto?

He estado husmeando las páginas de MSDN para la documentación de Grid ColumnDefinition y he encontrado GridLength() pero no entiendo cómo puedo usar esto en una expresión vinculante. No puedo usar el GridLengthConverter asociado como convertidor en el código de enlace, ya que no se deriva de IValueConverter.

Me inclino por enlazar de algún modo a la propiedad ActualWidth de una de las celdas en el objeto Grid. No parece tan claro como vinculante para la definición de la columna, pero por el momento no puedo lograr que funcione.

+0

¿Cómo y en qué punto está creando el control de usuario? ¿Se ha mostrado la grilla? – Donnelle

+0

No puede confiar en la configuración de puntos de interrupción en el conjunto/get de una propiedad de dependencia, ya que nunca serán utilizados por el motor de enlace. Las propiedades de la depenncencia interna se establecen usando SetValue (DependencyProperty, value) –

Respuesta

9

Bueno, yo tengo un poco de trabajo kludge, voy a explicar cómo las generaciones futuras:

Esencialmente tengo una columna 2, rejilla de múltiples fila con un divisor derecho alineado en la primera columna para que pueda ser redimensionado por el usuario si el contenido que contiene requiere más espacio. Para complicar las cosas, tengo un control de usuario cargado programáticamente en algunas de las filas, que tiene una columnSpan de 2 para fines de representación (el contenido 'sangra' de una celda a la siguiente).

Cuando se cambia el tamaño de la primera columna, necesito que esto se refleje en el control de usuario. Primero intenté enlazar con ColumnDefinition pero realmente no estaba jugando a la pelota.

Cómo me fijo/kludged que

En una pila de repuesto en la primera columna he añadido un <Label> con una x: Nombre para que sea accesible. Como está en una celda, tiene propiedades predeterminadas de 'Estirar' y llena la celda por completo. Se vuelve a clasificar según el tamaño cuando la columna se vuelve a clasificar según el tamaño usando el divisor. La vinculación a la propiedad ActualWidth de la etiqueta significa que los cambios en el tamaño de la columna se comunican a DependancyProperty en mi columnSpanned usercontrol correctamente.

Pensamientos

Obviamente, a pesar de que tiene una propiedad ColumnDefinition ActualWidth cuando cambia no parece desencadenar el evento PropertyChanged internamente (o esa es mi mejor conjetura). Esto puede ser un error, o por diseño, pero para mí significa que he tenido que usar una solución menos limpia.

+1

Esto funcionó bien para mí. Tengo un ligero giro: Foredecker

3

Ha intentado configurar el enlace en xaml, lo siguiente debería funcionar para usted.

<ColumnDefinition 
    x:Name="TitleSection" 
    Width="{Binding 
       Path=TitleWidth, 
       RelativeSource={RelativeSource AncestorType=MyUserControl}}" 
    /> 

De lo contrario, mirando el código de enlace que haya suministrado, se ve al revés para mí, el objetivo de la unión debe ser la columna de la rejilla y la fuente debe ser su propiedad de dependencia.

El código equivalente para la xaml anterior es

BindingOperations.SetBinding(TitleSection, ColumnDefinition.WidthProperty, 
    new Binding() 
    { 
     RelativeSource= new RelativeSource(RelativeSourceMode.FindAncestor, typeof(MyUserControl),1), 
     Path = new PropertyPath("TitleWidth"), 
    }); 

En una nota relacionada, utilizando un GridSplitter y vinculante de la propiedad de ancho son mutally exclusiva. Tan pronto como cambie el tamaño de la columna utilizando el divisor, su enlace será reemplazado con el valor del divisor.

Esto es similar a lo que experimentaría al actualizar cualquier propiedad que sea el objetivo de un enlace. Cuando establece el valor de los objetivos directamente en el código, está reemplazando esencialmente el objeto vinculante con el valor que proporciona.

2

ColumnDefinition.Width no es un número entero: es un GridLength. No puede enlazar el GridLength directamente al entero, necesita un convertidor.

Esta es también la razón por la que no se puede enlazar ninguna propiedad Ancho de control (doble) a la propiedad Ancho de cuadrícula (GridLength) de ColumnDefinition sin un convertidor.

Cuestiones relacionadas