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.
¿Cómo y en qué punto está creando el control de usuario? ¿Se ha mostrado la grilla? – Donnelle
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) –