/ / Wiązanie dołączonej właściwości do elementu w ItemsControl z niestandardowym problemem panelu - wpf, xaml, bindowanie, właściwości załączone

Powiązanie załączonej właściwości z ItemControl z niestandardowym problemem panelu - wpf, xaml, binding, attached-properties

Nie mogę sprawić, by następujący XAML działał tak, jak chcę. Wszystkie powiązania działają, ponieważ nie otrzymuję błędów z powiązań. Ale nie otrzymuję oczekiwanego wyniku z powiązania na RatioShape prostokąt. Problem polega na tym, że dołączona właściwość wpflib: RatioPanel.Ratio zawsze zwraca wartość domyślną, a nie wartość danych.

Więc myślę, że załączona nieruchomość jest włączona RatioShape jest ustawiony w niewłaściwym „kontekście”. Jak powiązać z dołączoną właściwością, aby wpflib: RatioPanel dostaje związaną wartość?

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

Odpowiedzi:

6 dla odpowiedzi № 1

Elementy potomne RatioPanel będą instancjami ContentPresenter, przy założeniu, że elementy nie są UIElements. ContentPresenter wyświetli DataTemplate, który zdefiniowałeś w ItemTemplate.

Zwykle panele działają bezpośrednio z nimidzieci. Ustawiasz swoją dołączoną właściwość na potomku ContentPresenter, który jest potomkiem twojego panelu. Uważam, że powinieneś ustawić to bezpośrednio w ContentPresenter. Więc coś takiego:

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