wpf xaml binding attached-properties

wpf - Enlazar una propiedad adjunta a un elemento en ItemsControl con un problema de panel personalizado



xaml binding (1)

No puedo hacer que el siguiente XAML funcione como yo quiero. Todas las vinculaciones funcionan porque no obtienen errores de las vinculaciones. Pero no obtengo el resultado esperado del enlace en el rectángulo RatioShape . El problema es que la propiedad adjunta wpflib: RatioPanel.Ratio siempre devuelve su valor predeterminado, no el valor de datos.

Así que estoy pensando que la propiedad adjunta en RatioShape está configurada en el "contexto" incorrecto. ¿Cómo se vincula a la propiedad adjunta para que wpflib: RatioPanel obtenga el valor consolidado?

<wpflib:RatioContentPresenter2 RatioMaxValue="{Binding Path=RatioMaxValue}"> <ItemsControl Grid.Row="0" wpflib:RatioContentPresenter2.RatioOffset="{Binding Path=RatioOffset}" wpflib:RatioContentPresenter2.RatioValue="{Binding Path=RatioValue}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <wpflib:RatioPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Rectangle x:Name="RatioShape" wpflib:RatioPanel.Ratio="{Binding Path=Value}" Fill="{Binding Path=Brush}" /> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ItemsSource> <Binding Path="RatioItems" Mode="OneWay" /> </ItemsControl.ItemsSource> </ItemsControl> </wpflib:RatioContentPresenter2>


Los hijos de RatioPanel serán instancias de ContentPresenter, suponiendo que los elementos no son UIElements. ContentPresenter mostrará la DataTemplate que ha definido en ItemTemplate.

Normalmente, los paneles trabajan directamente con sus hijos. Está configurando la propiedad adjunta en el hijo de ContentPresenter, que es hijo de su panel. Creo que deberías configurar esto en el ContentPresenter directamente. Entonces algo como esto:

<ItemsControl.ItemContainerStyle> <Style> <Setter Property="wpflib:RatioPanel.Ratio" Value="{Binding Path=Value}" /> </Style> </ItemsControl.ItemContainerStyle> <ItemsControl.ItemTemplate> <DataTemplate> <Rectangle x:Name="RatioShape" Fill="{Binding Path=Brush}" /> </DataTemplate> </ItemsControl.ItemTemplate>