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

Я не могу заставить следующий 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>

person Stefan Ahlm    schedule 25.05.2011    source источник


Ответы (1)


Дочерние элементы RatioPanel будут экземплярами ContentPresenter, при условии, что элементы не являются UIElement. 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>
person CodeNaked    schedule 25.05.2011
comment
почему, черт возьми, прикрепленные свойства должны быть установлены по-разному? Это сбивает с толку асф. Проклятый WPF. - person Konrad; 15.04.2019