Привязка прикрепленного свойства к элементу в ItemsControl с проблемой пользовательской панели - PullRequest
4 голосов
/ 25 мая 2011

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

6 голосов
/ 25 мая 2011

Дочерними элементами RatioPanel будут экземпляры ContentPresenter, при условии, что элементы не являются элементами UIE. ContentPresenter отобразит шаблон данных, определенный вами в 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>
...