rowspan - wpf grid two columns
Enlace de WPF al ancho de la columna de cuadrĂcula (3)
¿Has intentado configurar el enlace en xaml? Lo siguiente debería funcionar para ti.
<ColumnDefinition
x:Name="TitleSection"
Width="{Binding
Path=TitleWidth,
RelativeSource={RelativeSource AncestorType=MyUserControl}}"
/>
De lo contrario, al mirar el código de encuadernación que ha proporcionado, se ve mal para mí, el objetivo del enlace debe ser la columna de la cuadrícula y la fuente debe ser su propiedad de dependencia.
El código equivalente para el 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, usar un GridSplitter y enlazar la propiedad Ancho son mutalmente exclusivos. 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.
Estoy intentando vincular una DependancyProperty
en uno de mis controles de usuario a la propiedad Width
de una Column
en una Grid
.
Tengo 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 separado, tengo definida la siguiente DependancyProperty
.
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 del código Usercontrol en el código, por lo tanto, tengo una declaración vinculante 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 vinculación definida funciona fantásticamente, aunque eso es vinculante para un UIElement real (en este caso, un control deslizante), pero falla el enlace a "TitleSection" (que es la definición de columna definida en la cuadrícula). Poner un punto de interrupción en el código y hacer un seguimiento en "TitleSection" devuelve el objeto esperado.
Estoy comenzando a sospechar que ax: Name''d ColumnDefinition no se puede enlazar a. ¿Alguien puede sugerir cómo podría vincularme al ancho variable de la primera columna de mi grilla?
EDIT # 1 - Para responder a los comentarios
El enlace de datos ''falla'' en el sentido de que con un punto de interrupción establecido en el TitleWidth
propiedad TitleWidth
y utilizando el control GridSplitter para cambiar el tamaño de la primera columna, nunca se golpea el punto de corte. 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, x: Name''d Element TitleSection
se puede ver y tiene un valor de 100
cuando se están construyendo / antes de que se TitleSection
el enlace.
EDIT # 2: ¿Posiblemente algo que ver con esto?
He estado husmeando las páginas de MSDN para la documentación de Grid ColumnDefinition y me he encontrado con 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 vincular de algún modo 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.
Bueno, tengo un poco de kludge funcionando, explicaré cómo para las generaciones futuras:
Básicamente, tengo una cuadrícula de dos columnas y varias filas con un divisor alineado a la derecha en la primera columna, por lo que el usuario puede cambiar el tamaño 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 lo arreglé / Kludged
En una celda adicional en la primera columna, agregué una <Label>
con una x: Nombre para hacerla 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. El enlace a la propiedad ActualWidth
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 ColumnDefinition tiene una propiedad ActualWidth
cuando cambia, parece que no ActualWidth
internamente el evento PropertyChanged
(o esa es mi mejor estimación). Esto puede ser un error, o por diseño, pero para mí significa que he tenido que usar una solución menos limpia.
ColumnDefinition.Width no es un entero; es un GridLength. No puede vincular GridLength directamente al entero, necesita un convertidor.
Esta es también la razón por la que no se puede enlazar ninguna propiedad de ancho de control (doble) a la propiedad ancho de cuadrícula (GridLength) de ColumnDefinition sin un convertidor.