2013-09-07 9 views
7

Voglio ottenere il conteggio di un oggetto ListView. Ma usa un Template, quindi, ho bisogno di usare AncestorType, ho un codice che in WPF funziona bene, ma in Windows Store Apps 8 no, perché non c'è AncestorType lì, quindi cosa posso fare invece? Come posso far funzionare questo codice in winRT?WinRT Cosa può essere invece AncestorType?

Ecco il mio codice:

<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

ho condiviso una soluzione per RelativeSource AncestorType in UWP sopra a http://stackoverflow.com/a/43399114/303612 –

risposta

1

Come ci si trova in un ControlTemplate, avete bisogno di qualche modo per uscire e affrontare il sottostante DataContext. Dipende da come hai definito l'oggetto a cui sei vincolante. Ad esempio, se è stato definito un ViewModel nelle risorse, si potrebbe accedere lo stesso come la proprietà 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}"/> 

Questo è un modo per affrontare questo.

+0

sono in un ControlTemplate, è per questo che ho voluto l'AncestorType, può tu sai cosa posso fare invece? –

+0

Il codice di esempio è ciò che puoi provare. –

+0

Grazie, bastava cambiare il percorso in Users.Count (non c'è bisogno di Source) ... –

7

La risposta che è stato pubblicato da Ed cappella ha un grosso svantaggio:

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

porta a che MyViewModel sarà costruito ancora una volta. In scenari comuni, questo è un comportamento indesiderato.

A proposito, c'è un trucco perfetto da associare a quello del genitore DataContext senza ricostruire un modello di visualizzazione.

Supponendo MyViewModel ha un 'iCommand' chiamato TestCommand ed è corrente DataContext di una pagina, che contiene il vostro UserControl, impostare la x:Name di una pagina e basta legare DataContext di una pagina a una proprietà Tag di UserControl usando ElementName vincolante:

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

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

    ... 
</Page> 

e poi in XAML del vostro UserControl impostare la x:Name-UserControl e legare la vostra proprietà a una proprietà in Tag:

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

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

</UserControl> 

Questo è, probabilmente, non il trucco più pulito, che funziona perché la proprietà Tag è una proprietà di dipendenza di tipo object ed è possibile associare qualsiasi cosa ad essa.

5

La soluzione più semplice è denominare qualsiasi contenitore radice con il modello di visualizzazione in contesto e impostare semplicemente il DataContext del controllo/contenitore all'interno di ContentControl citando il nome dell'elemento e otterrete lo stesso contesto.

Esempio, (io ho chiamato la mia griglia di radice di pagina come 'rootGrid' e impostare il contesto da 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

ho ottenuto in questo modo in UWP

<GridView x:Name="abc" ItemsSource="{Binding Path=DataContext.Companies,RelativeSource={RelativeSource Mode=TemplatedParent}}"></GridView> 
Problemi correlati