2015-04-14 3 views
0

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

Мне нужно уметь определять, сколько детей имеет стековая панель. Я предположил, что это возможно с использованием режима 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, которые были добавлены к StackPanel и быть в состоянии использовать эту amound детей, чтобы вычислить высоту сетки внутри DataTemplate.

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

+0

Я мог бы неправильно понять ваш вопрос, но разве вы не можете просто подсчитать количество элементов в данных, связанных с коллекцией 'Matches'? – Sheridan

+0

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

+0

Шеридан, я думаю, он хочет знать, что сделанный размер от нет. элементов в управлении – Muds

ответ

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(); 
    } 
} 

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

+0

Извините, если я ошибаюсь, но вы не видите проблему здесь. Сетка расположена внутри DataTemplate. Поскольку это динамически, я не могу передать какой-либо параметр, который не включен в контекст привязки. Это включает в себя стек, который является родительским элементом UserControl. UserControl даже не присутствует в файле XAML, где находится StackPanel. – DerpyNerd

+0

Хм, хорошо. Взгляните на него :) – Moddaman

+0

Хорошо, я попробовал еще раз :). – Moddaman

 Смежные вопросы

  • Нет связанных вопросов^_^