Как я могу получить доступ к ListViewItems WPF ListView?

Кодирование:

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java:

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

Выход:

[Стив 12 Даниил, Сахин 10 Тендулкар]

[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]

Если вы не используете toString () в классе Pojo (Student.java), вы будете получите выход, например [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. Чтобы избежать такой проблемы, мы используем метод toString ().

13
задан David Schmitt 2 February 2009 в 19:02
поделиться

3 ответа

Понять, почему ContainerFromItem не работал на меня, здесь некоторый фон. Обработчик событий, где мне была нужна эта функциональность, похож на это:

var item = new SomeListItem();
SomeList.Add(item);
ListViewItem = SomeList.ItemContainerGenerator.ContainerFromItem(item); // returns null

После Add() эти ItemContainerGenerator сразу не создает контейнер, потому что CollectionChanged событие могло быть обработано на non-UI-thread. Вместо этого это запускает асинхронный вызов и ожидает потока UI к обратному вызову, и выполните фактическое поколение управления ListViewItem.

, Чтобы быть уведомленным то, когда это происходит, эти ItemContainerGenerator, выставляет StatusChanged событие, которое запущено после того, как все Контейнеры сгенерированы.

Теперь я должен слушать это событие и решить ли управление в настоящее время want's для установки фокуса или нет.

17
ответ дан David Schmitt 2 February 2009 в 19:02
поделиться

Как другие отметили, myBox TextBox не может быть найден путем вызова FindName на ListView. Однако можно получить ListViewItem, который в настоящее время выбирается, и используйте класс VisualTreeHelper для получения TextBox от ListViewItem. Сделать так выглядит примерно так:

private void myList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (myList.SelectedItem != null)
    {
        object o = myList.SelectedItem;
        ListViewItem lvi = (ListViewItem)myList.ItemContainerGenerator.ContainerFromItem(o);
        TextBox tb = FindByName("myBox", lvi) as TextBox;

        if (tb != null)
            tb.Dispatcher.BeginInvoke(new Func<bool>(tb.Focus));
    }
}

private FrameworkElement FindByName(string name, FrameworkElement root)
{
    Stack<FrameworkElement> tree = new Stack<FrameworkElement>();
    tree.Push(root);

    while (tree.Count > 0)
    {
        FrameworkElement current = tree.Pop();
        if (current.Name == name)
            return current;

        int count = VisualTreeHelper.GetChildrenCount(current);
        for (int i = 0; i < count; ++i)
        {
            DependencyObject child = VisualTreeHelper.GetChild(current, i);
            if (child is FrameworkElement)
                tree.Push((FrameworkElement)child);
        }
    }

    return null;
}
14
ответ дан Abe Heidebrecht 2 February 2009 в 19:02
поделиться

Мы используем подобную технику с новым datagrid WPF:

Private Sub SelectAllText(ByVal cell As DataGridCell)
    If cell IsNot Nothing Then
        Dim txtBox As TextBox= GetVisualChild(Of TextBox)(cell)
        If txtBox IsNot Nothing Then
            txtBox.Focus()
            txtBox.SelectAll()
        End If
    End If
End Sub

Public Shared Function GetVisualChild(Of T As {Visual, New})(ByVal parent As Visual) As T
    Dim child As T = Nothing
    Dim numVisuals As Integer = VisualTreeHelper.GetChildrenCount(parent)
    For i As Integer = 0 To numVisuals - 1
        Dim v As Visual = TryCast(VisualTreeHelper.GetChild(parent, i), Visual)
        If v IsNot Nothing Then
            child = TryCast(v, T)
            If child Is Nothing Then
                child = GetVisualChild(Of T)(v)
            Else
                Exit For
            End If
        End If
    Next
    Return child
End Function

техника должна быть довольно применимой для Вас, просто передать Ваш listviewitem, после того как это сгенерировано.

-1
ответ дан Bob King 2 February 2009 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: