none
WPF Control innerhalb eines ListView finden RRS feed

  • Allgemeine Diskussion

  • Ich habe einen ListView, gebunden an eine Observable Collection.

    Über einen Button füge ich der ObservableCollection ein neues Element hinzu. Der ListView wird ebenfalls aktualisiert.

    Das Problem ist nur, ich finde nicht heraus, wann die Aktualisierung fertig ist.

    Ich möchte gern ein ähnliches Verhalten implementieren, wie im Windows Explorer, wenn man einen neuen Ordner anlegt.

    - Klick auf den Button

    - Anlegen eines neuen Objekts und einfügen in die ObservableCollection

    - SelectedItem des ListView auf das neue Element setzen

    - Editiermodus der im View enthaltenen Textbox einschalten (ist eine EditBox)

    das Problem ist folgendes:

    EditBox[] boxes = new List<EditBox>(FindControl<EditBox>(catList)).ToArray();
    
    private static IEnumerable<T> FindControl<T>(DependencyObject depObj) where T : DependencyObject
    {
      if (depObj != null)
      {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
          DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
          if (child != null && child is T)
          {
            yield return (T)child;
          }
          foreach (T childOfChild in FindControl<T>(child))
          {
            yield return childOfChild;
          }
        }
      }
    }
    

    das EditBox Array ist immer eine Nummer zu klein. Nach dem Einfügen des neuen Elementes ist die Größe der Liste catList == 7. So ist es korrekt. Ich bekomme aber nur ein Array der Größe 6 zurück. offensichtlich ist die catList schon aktualisiert, der View jedoch noch nicht.

    Ich plage mich seit Tagen mit diesem Problem.

     

    Bin über jeden Vorschlag dankbar.

    Dienstag, 12. April 2011 16:41

Alle Antworten

  • Also um das SelectedItem zu setzen würde ich das neue Element nachdem du es in die ObservableCollection eingefügt hast per Binding setzen, d.h. ein Property im VM (verwendest du ein ViewModel?) an die SelectedItem-Eigenschaft der ListView binden (TwoWay, PropertyName z.B. MySelectedItem), dann kannst du im ViewModel dein MySelectedItem auf die EditBox setzen, die du gerade erzeugt und in die ObservableCollection gesteckt hast.

    Was ich noch nicht ganz verstehe: Der Code sieht aus wie wenn er in einem CustomControl stehen könnte. Ist das der Fall? Aber selbst da hast du ja Zugriff auf das SelectedItem und kannst es setzen. Dann brauchst du den Umweg über den VisualTreeHelper nicht. Wenn der Code nicht in einem CustomControl steht, dann wäre evtl ein MVVM-Ansatz von Vorteil.

    Mit mehr Angaben kann man dier besser/gezielter helfen...

    Montag, 6. Juni 2011 07:34