Câu hỏi Làm thế nào để dữ liệu ràng buộc lồng nhau ListView ItemTemplates trong Metro / WinRT?


Trong ViewModel của tôi, tôi có một bộ sưu tập các đối tượng mà mỗi đối tượng chứa một bộ sưu tập khác. Tôi đang cố gắng để hiển thị này trong View của tôi bằng cách sử dụng lồng nhau ListView ItemTemplates. Dưới đây là cách đơn giản hóa mã ViewModel của tôi:

public ViewModelObject
{
    public ObservableCollection<OuterObject> OuterCollection { get; }
}

public OuterObject
{
    public string OuterTitle;
    public ObservableCollection<InnerObject> InnerCollection { get; }
}

public InnerObject
{
    public string InnerTitle;
}

Và đây là cách đơn giản hóa cách tôi đang cố gắng sử dụng ViewModel này trong XAML của tôi:

<ListView ItemsSource="{Binding OuterCollection}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding OuterTitle}"/>
                <ListView ItemsSource="{Binding InnerCollection}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding InnerTitle}"/>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Nếu tôi loại bỏ ListView bên trong, thì ràng buộc ListView bên ngoài hoạt động hoàn toàn tốt. Tôi chỉ không thể tìm ra cách để ràng buộc đúng đối tượng bộ sưu tập bên trong vào ListView bên trong. Tôi đã cố gắng thực hiện ràng buộc bên trong với {Binding OuterCollection.InnerCollection}, {Binding DataContext.InnerCollection}{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection}, nhưng tất cả những điều này làm cho nó sụp đổ. Cách thích hợp để đạt được ràng buộc lồng nhau này là gì?

CHỈNH SỬA: Tôi nên thêm rằng đây là cho một ứng dụng đang được chuyển từ Windows Phone 7, và nó là một nỗ lực để tìm một sự thay thế cho LongListSelector, không có sẵn trong WinRT.


7
2017-07-13 22:35


gốc




Các câu trả lời:


Tôi đã tìm ra giải pháp! Nó yêu cầu một sự kết hợp của các giải pháp đã thử trước đó của tôi. Ràng buộc chính xác cho bộ sưu tập nội bộ trong một ListView lồng nhau là:

{Binding RelativeSource={RelativeSource TemplatedParent},
                         Path=DataContext.InnerCollection}

Ngoài ra, tùy thuộc vào mục đích của bạn cho các ListView lồng nhau, tôi thấy nó tốt hơn để sử dụng một ItemsView cho bộ sưu tập bên ngoài và một ListView cho bộ sưu tập bên trong. Nếu không, khả năng lựa chọn của hai điều khiển chồng lên nhau.


8
2017-07-16 19:28



Điều này làm việc cho tôi! Tôi đã điên cố gắng tìm ra nó. Một vấn đề - bạn có phải thay đổi {Binding InnerTitle} thành cái gì khác không? Tôi thấy tất cả các phần tử ListView của mình được tạo chính xác nhưng {Binding InnerTitle} không hoạt động. - Weston
Nevermind - vấn đề của tôi là tôi không nhận ra public string Name; không ràng buộc, trong khi public string Name { get; set; } làm. - Weston