Установка вложенных свойств в родительском ContentPresenter из DataTemplate - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть Grid и где-то в нем ContentControl:

<Grid Name="OuterGrid">
    <!-- some controls on the grid -->

    <ContentControl Name="dbg1" Content="{Binding Mode=OneWay}" ContentTemplateSelector="{StaticResource SBATemplateSelector}"></ContentControl>

    <!-- some more controls on the grid -->
</Grid>

Выбор шаблона не очень интересен:

<src:SBATemplateSelector x:Key="SBATemplateSelector"
    NormalTemplate="{StaticResource SBAreaTemplate1}"
    BigTemplate="{StaticResource SBAreaTemplate2}" />

Но из шаблонов я быЯ хотел бы передать содержимое и поместить его в 'OuterGrid', установив присоединенные свойства Grid.Row и т. д.:

<DataTemplate x:Key="SBAreaTemplate1" DataType="src:XCViewModel">
    <DataTemplate.Resources>
        <Style TargetType="ContentPresenter"> <!-- should go for only the 'parent' contentpresenter -->
            <Setter Property="Grid.Row" Value="4" />
            <Setter Property="Grid.Column" Value="0" />
            <Setter Property="Grid.RowSpan" Value="5" />
            <Setter Property="Grid.ColumnSpan" Value="10" />
        </Style>
    </DataTemplate.Resources>

    <Border Name="sbAreaBorder" BorderThickness="1" BorderBrush="Black">
        <ScrollViewer Name="sblbScroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <StackPanel Orientation="Vertical">
                <ItemsControl Name="notRelevantListBox" ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource NotRelevantSelector}" />
            </StackPanel>
        </ScrollViewer>
    </Border>
</DataTemplate>

, поэтому я даже не хочу привязывать, просто устанавливаю свойства в статические значения.Независимо от того, что я делаю, я не могу заставить свойства вступить в силу на ContentPresenter из DataTemplate.

Существуют почти пригодные для использования решения (например, https://social.msdn.microsoft.com/Forums/vstudio/en-US/cc9ed724-600e-415a-b775-bae09eea66f8/cant-use-attached-properties-inside-a-datatemplate?forum=wpf), но они всегда применяют ItemsControl - у меня нет ItemsControl, я хочу, чтобы позиционирование работало для всего DataTemplate.

1 Ответ

0 голосов
/ 05 февраля 2019

ContentTemplate не может установить Grid.Row и Grid.Column присоединенное свойство ContentControl.Шаблон применяется только к Content из ContentControl.

Но вы можете сделать это программно в вашем ContentTemplateSelector:

public class SBATemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item != null)
        {
            ContentPresenter cp = container as ContentPresenter;
            if (cp != null)
            {
                ContentControl cc = VisualTreeHelper.GetParent(cp) as ContentControl;
                if (cc != null)
                {
                    Grid.SetRow(cc, 4);
                    Grid.SetColumn(cc, 0);
                    Grid.SetRowSpan(cc, 5);
                    Grid.SetColumnSpan(cc, 10);
                }
            }

        }
        ...
    }
}
...