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