Привязка присоединенного свойства к элементу в ItemsControl с проблемой пользовательской панели

#wpf #xaml #binding #attached-properties

#wpf #xaml #привязка #прикрепленные свойства

Вопрос:

Я не могу заставить следующий XAML работать так, как я хочу. Все привязки работают, потому что не получают ошибок от привязок. Но я не получаю ожидаемого результата от привязки к прямоугольнику RatioShape. Проблема в том, что прикрепленное свойство wpflib:RatioPanel.Ratio всегда возвращает значение по умолчанию, а не привязанное к базе данных.

Итак, я думаю, что прикрепленное свойство в RatioShape установлено в неправильном «контексте». Как выполнить привязку к присоединенному свойству, чтобы wpflib:RatioPanel получал привязанное значение?

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

Ответ №1:

Дочерние элементы RatioPanel будут экземплярами ContentPresenter, предполагая, что элементы не являются элементами UIElements. ContentPresenter отобразит DataTemplate, который вы определили в ItemTemplate.

Обычно панели работают напрямую со своими дочерними элементами. Вы устанавливаете прикрепленное свойство на дочернем элементе ContentPresenter, который является дочерним элементом вашей панели. Я считаю, что вы должны устанавливать это непосредственно в ContentPresenter. Итак, что-то вроде этого:

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

Комментарии:

1. какого черта прикрепленные свойства должны быть установлены по-другому? Это сбивает с толку asf. Проклятый WPF.