Wyjątek TargetException

0

Witam,
piszę program w WPF, mam obiekt TreeView, dodaje sobie do niego elementy w pętli. Mam metodę która ma zaznaczać wybrany item w drzewie, wywoływana w ten sposób:

SetSelectedItem(ref TreeList, this.FindName("mainCategory")
public void SetSelectedItem(ref TreeView control, object item)
{

	DependencyObject dObject = control.ItemContainerGenerator.ContainerFromItem(item);              

	MethodInfo selectMethod = typeof(TreeViewItem).GetMethod("Select",
		  BindingFlags.NonPublic | BindingFlags.Instance);

	selectMethod.Invoke(dObject, new object[] { true });
}

Jeżeli ma zostać zaznaczony główny element jest ok. Jeżeli jest to jakieś dziecko dostaje wyjątek:

System.Reflection.TargetException was unhandled
Message=Dla metody niestatycznej wymagany jest obiekt docelowy.
Source=mscorlib

Proszę o pomoc.
Pozdro.

0

po co ci ref prze TreeView? Obiekt klasy i tak jest przez referencję przekazywany.
I po co zaprzęgasz refleksje?

spróbuj tak:

public void SetSelectedItem(TreeView control, object item)
{
  TreeViewItem tvItem = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
  if (tvItem != null)
  {
    tvItem.IsSelected = true;
    tvItem.BringIntoView();
    tvItem.Focus();
}

pozostaje kłopot ewentualnego rozwinięcia wszystkich node'ów od tego do root'a, jeśli których jest zwinięty.

Zresztą ja bana na google nie mam :) i znalazłem już to opisane, więc się nie będę produkował.
http://blog.quantumbitdesigns.com/2008/07/22/programmatically-selecting-an-item-in-a-treeview/#respond

0

Też nie mam bana na google :) Widziałem tą funkcje, jak i tą którą użyłem, żadna z nich mi nie chce działać. Mam teraz:

public void SetSelectedItem(TreeView control, object item)
{
    TreeViewItem tvItem = control.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;

    if (tvItem != null)
    {
          tvItem.IsSelected = true;
          tvItem.BringIntoView();
          tvItem.Focus();
    }
}

Po kliknięciu nie dzieje się dosłownie nic, jest to spowodowane tym że **tvItem **jest null, jednak item jest obiektem. Nie mam pojęcia o co może chodzić...

0

a co zwraca ContainerFromItem? Przed rzutowaniem, bo jeśli zwraca inny typ niż TreeViewItem, to użycie operatora as spowoduje że tvItem będzie null.
Debugger i do roboty.

0

W tym jest właśnie problem że zwraca System.Windows.Controls.TreeViewItem: Items.Count:1

0

Dzięki za pomoc, sprawa już nie aktualna. Gdyby ktoś potrzebował:

public bool SetSelectedItem(ItemsControl parent, object child) 
        {
            if (parent == null || child == null) {
                return false;
            }
 
            TreeViewItem childNode = parent.ItemContainerGenerator.ContainerFromItem(child) as TreeViewItem;
 
            if (childNode != null) {
                childNode.Focus();
                return childNode.IsSelected = true;
            }
 
            if (parent.Items.Count > 0) {
                foreach (object childItem in parent.Items) {
                    ItemsControl childControl = parent.ItemContainerGenerator.ContainerFromItem(childItem) as ItemsControl;
 
                    if (SetSelectedItem(childControl, child)) {
                        return true;
                    }
                }
            }
 
            return false;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1