2013-09-07 8 views
7

Chcę uzyskać liczbę elementów ListView. Ale używa szablonu, dlatego muszę użyć AncestorType, mam kod, który w WPF działa dobrze, ale w Windows Store Apps 8 nie, ponieważ nie ma tam AncestorType, więc co mogę zrobić zamiast tego? Jak mogę sprawić, aby ten kod działał w winRT?WinRT Co może być zamiast AncestorType?

Oto mój kod:

<ListView ItemsSource="{Binding Users}"> 
    <ListView.Style> 
     <Style TargetType="ListView"> 
     <Style.Setters> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Border BorderThickness="1" BorderBrush="LightGray"> 
          <StackPanel> 
           <ScrollViewer> 
            <ItemsPresenter /> 
           </ScrollViewer> 
           <TextBlock Margin="0,4" FontWeight="Bold"> 
            <Run Text="Count: "/> 
            <Run Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}}, Path=Items.Count, Mode=OneWay}"/> 
           </TextBlock> 
          </StackPanel> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter>      
     </Style.Setters> 
    </Style> 
    </ListView.Style> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ListViewItem IsHitTestVisible="False"> 
       <StackPanel> 
        <facebookControls:ProfilePicture Height="74" Width="74" ProfileId="{Binding FacebookId}" /> 
        <TextBlock Text="{Binding UserName}" FontSize="18" HorizontalAlignment="Center" /> 
       </StackPanel> 
      </ListViewItem> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

ja wspólne rozwiązanie RelativeSource AncestorType w UWP na co http://stackoverflow.com/a/43399114/303612 –

Odpowiedz

1

Jak jesteś w ControlTemplate, trzeba w jakiś sposób wyrwania się i rozwiązuje problemu z istniejącą DataContext. To zależy od tego, jak zdefiniowałeś obiekt, do którego się zobowiązałeś. Na przykład, jeśli zdefiniowano ViewModel w zasobach, można uzyskać dostęp to samo jako własność Users:

<UserControl ... > 
    <UserControl.Resources> 
     <vm:MyViewModel x:Key="ViewModel" /> 
    </UserControl.Resources> 
    ... 
    <Grid DataContext="{Binding Source={StaticResource ViewModel}}"> 
     <ListView ItemsSource="{Binding Users}"> 
     ... 
     <ControlTemplate> 
     ... 
      <Run Text="{Binding Source={StaticResource ViewModel}, 
           Path=Users.Count}"/> 

Jest to jeden ze sposobów radzenia sobie z tym.

+0

jestem w ControlTemplate, dlatego chciałem AncestorType, puszka radzisz, co mogę zrobić zamiast tego? –

+0

Przykładowy kod to, co możesz spróbować. –

+0

Dzięki, wystarczy zmienić ścieżkę do Users.Count (bez potrzeby źródła) ... –

7

Odpowiedź który został opublikowany przez Eda Chapel ma jedną wielką wadę:

<vm:MyViewModel x:Key="ViewModel" /> 

prowadzi do tego MyViewModel zostanie zbudowana jeszcze raz. W typowych scenariuszach jest to niepożądane zachowanie.

Nawiasem mówiąc, istnieje doskonała sztuczka do powiązania z rodzicem DataContext bez rekonstrukcji modelu widoku.

Zakładając MyViewModel ma dodatkowe „ICommand” o nazwie TestCommand i jest obecny DataContext strony, która zawiera swoją UserControl ustawić x:Name strony i po prostu związać DataContext z strony do Tag własności UserControl użyciu ElementName oprawa:

<Page... 
    x:Name="rootPage"> 

    <Grid> 
     <controls:MyUserControl Tag={Binding DataContext, ElementName='rootPage'} ... /> 
    </Grid> 

    ... 
</Page> 

a potem w XAML twoich UserControl ustawić x:Name do UserControl i związać swoją nieruchomość do nieruchomości w Tag:

<UserControl ... 
    x:Name="rootControl"> 

    <Grid> 
     <Button Command={Binding Tag.TestCommand, ElementName='rootControl'} ... /> 
    </Grid> 

</UserControl> 

To prawdopodobnie nie najczystsza sztuczka, która działa, ponieważ właściwość Tag jest właściwością zależności typu object i można ją powiązać.

5

Najprostszym rozwiązaniem jest nazwanie dowolnego kontenera głównego, który ma swój model widoku w kontekście i wystarczy ustawić Kontekst danych kontrolki/kontenera w ContentControl przez podanie nazwy elementu, a otrzymasz ten sam kontekst.

Przykład (nazwałem mój główny siatkę stronie jako 'rootGrid' i ustawić kontekst przez DataContext = "{Binding ElementName = rootGrid, Path = DataContext}")

<ContentControl Name="contentControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         > 
     <Grid Height="600" 
       Width="600" 
       DataContext="{Binding ElementName=rootGrid, Path=DataContext}" 
       > 

      <Image Height="500" Width="500" 

        Source="{Binding photoUrl}" VerticalAlignment="Center" HorizontalAlignment="Stretch"/> 
     </Grid> 
    </ContentControl> 
0

dostałam to jak to w UWP

<GridView x:Name="abc" ItemsSource="{Binding Path=DataContext.Companies,RelativeSource={RelativeSource Mode=TemplatedParent}}"></GridView> 
Powiązane problemy