Как установить высоту сетки внутри DataTemplate

DataTemplate используется в ItemsControl внутри UserControl, UserControl добавляется несколько раз внутри панели стека. (Pfew)

Мне нужно уметь определить, сколько детей у стековой панели. Я предположил, что это было возможно с помощью FindAncestor режим, но я боюсь, что мне нужна ваша помощь.

Вот логика XAML:

<StackPanel Name="BeforeTournament" Orientation="Horizontal" VerticalAlignment="Top">
    <UserControl ...
    <Grid>
        <TextBlock Name="txtTitle" FontSize="14" />
            <ItemsControl Name="MatchList" ItemsSource="{Binding Matches, Mode=OneWay}" Width="400" Margin="-7,20,0,0"
                  ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                  ScrollViewer.VerticalScrollBarVisibility="Hidden">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Name="MatchTemplate" Width="390"
                          Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}},
                                       Path=(Children.Count * 300}"
                          Margin="0,0,0,50" VerticalAlignment="Center">
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
    </UserControl>

    //Duplicates below, same logic to determine width
    <UserControl></UserControl>
</StackPanel>

Поэтому я хотел бы знать, сколько элементов UserControl было добавлено в панель стека, и иметь возможность использовать это количество дочерних элементов для вычисления высоты сетки внутри DataTemplate.

Относительный источник FindAncestor выдает ошибку, в которой говорится, что Children не поддерживается в относительном контексте.

1 ответ

Решение

Хорошо, как я сказал в комментарии, должен быть лучший способ сделать это, но я уверен, что один из способов сделать это - использовать конвертер. Передайте стековую панель в качестве параметра и верните число дочерних элементов, умноженное на 300(если это то, что вы хотите)

Я пробовал этот код, и он работает. Просто для галочки я добавил два пользовательских элемента управления вручную. Я также попытался поместить usercontrols в отдельный файл xaml.

Main.xaml

<Window.Resources>
    <local:StackpanelConverter x:Key="StackpanelConverter"/>
</Window.Resources>
<StackPanel Name="BeforeTournament" Orientation="Horizontal" VerticalAlignment="Top">
    <UserControl>
        <Grid Height="200" Background="Brown">
            <TextBlock Name="txtTitle" FontSize="14" />
            <ItemsControl Name="MatchList" ItemsSource="{Binding MyControls}" BorderBrush="Bisque" BorderThickness="10"  Width="400" Margin="-7,20,0,0"
              ScrollViewer.HorizontalScrollBarVisibility="Hidden"
              ScrollViewer.VerticalScrollBarVisibility="Hidden">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Name="MatchTemplate" Width="390" Background="Blue"
                   Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}}, Converter={StaticResource StackpanelConverter}}"
                      Margin="0,0,0,50" VerticalAlignment="Center">

                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </UserControl>
    <UserControl>
        <Grid Height="200" Background="Brown">
            <TextBlock  FontSize="14" />
            <ItemsControl ItemsSource="{Binding MyControls}" BorderBrush="Bisque" BorderThickness="10"  Width="400" Margin="-7,20,0,0"
              ScrollViewer.HorizontalScrollBarVisibility="Hidden"
              ScrollViewer.VerticalScrollBarVisibility="Hidden">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Name="MatchTemplate" Width="390" Background="Blue"
                   Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}}, Converter={StaticResource StackpanelConverter}}"
                      Margin="0,0,0,50" VerticalAlignment="Center">

                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </UserControl>
</StackPanel>

Пример конвертера: (это написано в блокноте, поэтому могут быть ошибки)

 public class StackpanelConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var stackpanel = value as StackPanel;
        var height = stackpanel.Children.Count;
        return height*300;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Скажите, если я все еще не понимаю вопрос:)

Другие вопросы по тегам