2009-03-04 12 views
10

Tôi đã tạo một ListBoxDataTemplateItemtemplate. Tuy nhiên, có một cách dễ dàng để truy cập vào các UIElement tạo ra thay vì SelectedItem trong codebehind?Hộp danh sách WPF - Bắt UIElement thay vì SelectedItem

Khi tôi truy cập SelectedItem, tôi chỉ nhận được đối tượng đã chọn từ bộ sưu tập ItemsSource của tôi. Có cách nào để truy cập vào UIElement (ví dụ: phần tử được tạo từ DataTemplate cùng với đối tượng bị ràng buộc) không?

Trả lời

11

Bạn đang tìm kiếm thuộc tính ItemContainerGenerator. Mỗi ItemsSource có một phiên bản ItemContainerGenerator. Lớp học này có phương pháp sau đây mà bạn có thể quan tâm: ContainerFromItem(object instance).

Khi bạn có tay cầm vào số ListBoxItem, bạn có thể tiếp tục và duyệt cây hợp lý và trực quan. Hãy xem Logical Tree HelperVisual Tree Helper.

Giống như Andy đã nói trong nhận xét, chỉ vì mục tồn tại trong bộ sưu tập của bạn không có nghĩa là một vùng chứa đã được tạo cho nó. Bất kỳ loại kịch bản ảo hóa nào sẽ làm tăng vấn đề này; UIElements sẽ được tái sử dụng trên các mục khác nhau. Hãy cẩn thận với điều đó là tốt.

+0

Lưu ý rằng chỉ vì một mục đã được thêm vào sự kiểm soát, điều đó không có nghĩa là chứa giao diện của nó đã được tạo ra. Đảm bảo tính đến trường hợp chưa có vùng chứa giao diện người dùng. – Andy

+0

Tôi đang viết bằng C# và WPF và thuộc tính này không xuất hiện trong ListBox.ItemsContainer Làm cách nào để có được cá thể cho hộp danh sách này? – sprite

+0

@ize, bạn có giải pháp cho câu hỏi của mình không? http://stackoverflow.com/questions/6148279/record-items-visible-to-user-in-listbox (+250 bounty) – tofutim

4

siz, AndyBodeaker là hoàn toàn đúng.

Đây là cách tôi có thể truy xuất hộp văn bản của mục đã chọn của hộp danh sách bằng cách sử dụng tay cầm của nó.

var container = listboxSaveList.ItemContainerGenerator.ContainerFromItem(listboxSaveList.SelectedItem) as FrameworkElement; 
if (container != null) 
{ 
    ContentPresenter queueListBoxItemCP = VisualTreeWalker.FindVisualChild<ContentPresenter>(container); 
    if (queueListBoxItemCP == null) 
     return; 

    DataTemplate dataTemplate = queueListBoxItemCP.ContentTemplate; 

    TextBox tbxTitle = (TextBox)dataTemplate.FindName("tbxTitle", queueListBoxItemCP); 
    tbxTitle.Focus(); 
} 

(Lưu ý: Ở đây, VisualTreeWalker là wrapper của riêng tôi qua VisualTreeHelper với các chức năng hữu ích khác nhau tiếp xúc)