2013-09-07 63 views
7

Tôi muốn nhận số lượng mục ListView. Nhưng nó sử dụng một mẫu, do đó, tôi cần phải sử dụng AncestorType, tôi có một mã mà trong WPF hoạt động tốt, nhưng trong Windows Store Apps 8 không, bởi vì không có AncestorType ở đó, vì vậy tôi có thể làm gì? Làm thế nào tôi có thể làm cho mã này hoạt động trong winRT?WinRT Điều gì có thể thay thế AncestorType?

Đây là mã của tôi:

<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

tôi chia sẻ một giải pháp cho RelativeSource AncestorType trong UWP qua tại http://stackoverflow.com/a/43399114/303612 –

Trả lời

1

Như bạn đang ở trong một ControlTemplate, bạn cần một số cách để thoát ra khỏi và giải quyết các DataContext cơ bản. Nó phụ thuộc vào cách bạn xác định đối tượng mà bạn đang ràng buộc. Ví dụ, nếu bạn đã định nghĩa một ViewModel trong các nguồn lực, bạn có thể truy cập vào nó giống như Users tài sản:

<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}"/> 

Đây là một cách để đối phó với điều đó.

+0

tôi đang ở một ControlTemplate, đó là lý do tại sao tôi muốn AncestorType, có thể bạn khuyên tôi nên làm gì? –

+0

Mã ví dụ là những gì bạn có thể thử. –

+0

Cảm ơn, chỉ cần thay đổi Đường dẫn đến Users.Count (không cần Nguồn) ... –

7

Câu trả lời đó đã được đăng bởi Ed Chapel có một nhược điểm lớn:

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

dẫn đến MyViewModel rằng sẽ được xây dựng thêm một lần nữa. Trong các trường hợp phổ biến, đây là hành vi không mong muốn.

Nhân tiện, có một mẹo hoàn hảo để liên kết với số DataContext của phụ huynh mà không cần xây dựng lại mô hình chế độ xem.

Giả sử MyViewModel có 'ICommand' tên TestCommand và là hiện DataContext của một trang, trong đó có UserControl của bạn, thiết lập các x:Name của một trang và chỉ ràng buộc DataContext của một trang với một tài sản của UserControlTag sử dụng ElementName ràng buộc:

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

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

    ... 
</Page> 

và sau đó trong XAML của UserControl bạn thiết lập các x:Name-UserControl và ràng buộc tài sản của bạn để sở hữu một trong Tag:

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

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

</UserControl> 

Đó là, có thể, không phải là mẹo sạch nhất, hoạt động vì thuộc tính Tag là thuộc tính phụ thuộc loại object và bạn có thể ràng buộc bất kỳ thứ gì với nó.

5

Giải pháp đơn giản nhất là đặt tên bất kỳ vùng chứa gốc nào có mô hình khung nhìn của bạn trong Ngữ cảnh và chỉ đặt DataContext của điều khiển/vùng chứa bên trong ContentControl bằng tên đề cập đến phần tử và bạn sẽ nhận được cùng một ngữ cảnh.

Ví dụ, (tôi đã đặt tên lưới gốc của tôi về trang như 'rootGrid' và thiết lập bối cảnh bởi 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

tôi nó như thế này trong UWP

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