Pregunta

Estoy intentando vincular un DependancyProperty en uno de mis controles de usuario a la propiedad Width de un Column en un Grid.

Tengo un código similar a este:

<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 control de usuario separado tengo el siguiente TitleWidth 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 Usercontrol en el código, por lo tanto, tengo una declaración vinculante similar a esta:

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 */

El primer enlace definido funciona fantásticamente, aunque eso es vinculante 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 vigilar & Quot; TitleSection & Quot; Devuelve el objeto esperado.

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

EDITAR # 1 - Para responder comentarios

El enlace de datos 'falla' en el sentido de que con un punto de interrupción establecido en el setter para la propiedad Window_Loaded, y usando el control GridSplitter para cambiar el tamaño de la primera columna, el punto de interrupción nunca se alcanza. Además, el código que esperaría que se disparara cuando los cambios de DependancyProperty TitleSection no se ejecuten.

El control de usuario se está creando y agregando a un Stackpanel dentro de la cuadrícula en la función 100. Esperaría que la cuadrícula se haya procesado cuando se construyan los controles de usuario. Ciertamente, el elemento x: Name'd <=> se puede ver y tiene un valor de <=> cuando se están construyendo / antes de que ocurra el enlace.

EDITAR # 2 - ¿Posiblemente algo que ver con esto?

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

Me estoy inclinando hacia el enlace de alguna manera a la propiedad ActualWidth de una de las celdas en el objeto Grid. No parece tan limpio como el enlace a la definición de columna, pero por el momento no puedo hacer que eso funcione.

¿Fue útil?

Solución

Bueno, tengo un poco de trabajo, explicaré cómo para las generaciones futuras:

Esencialmente tengo una cuadrícula de 2 columnas y varias filas con un divisor alineado a la derecha en la primera columna para que el usuario pueda cambiar su tamaño si el contenido que contiene requiere más espacio. Para complicar las cosas, tengo un control de usuario que se carga programáticamente en algunas de las filas que tiene un 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 del usuario. En primer lugar, intenté vincularme a ColumnDefinition pero realmente no estaba jugando a la pelota.

Cómo lo arreglé / eliminé

En una celda libre en la primera columna, agregué un <Label> con una x: Nombre para que sea accesible. Como está en una celda, tiene las propiedades predeterminadas de 'Estirar' y llena la celda por completo. Se redimensiona a medida que la columna se redimensiona usando el divisor. El enlace a la propiedad ActualWidth de la etiqueta significa que los cambios en el tamaño de la columna se comunican a DependancyProperty en mi control de usuario columnSpanned correctamente.

Pensamientos

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

Otros consejos

¿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, al mirar el código de enlace que ha proporcionado, me parece que está mal, el objetivo del enlace debe ser la columna de cuadrícula y el origen 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, el uso de un GridSplitter y el enlace de la propiedad Width son mutalmente exclusivos. Tan pronto como cambie el tamaño de la columna con el divisor, su enlace se reemplazará 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 de enlace con el valor que proporciona.

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

Esta es también la razón por la que no puede vincular ninguna propiedad de Ancho de control (doble) a una propiedad de Ancho de definición de columna (GridLength) sin un convertidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top