Entwickler-Ecke

WPF / Silverlight - Vom Button in der Listbox zum Selected Index


ebber - Mi 09.11.11 12:44
Titel: Vom Button in der Listbox zum Selected Index
Hallo,

ich habe eine WPF Listbox in der, in einem Item, unter anderem ein Button ist. Die Daten sind gebinded.

Nun habe ich es aber nicht geschafft bei einem Button Click auf das Item zurückzuschließen. Ich suche also entweder den Index oder das gebindete Element.

Leider ist nach einem Button Click nicht das Item der Listbox ausgewählt.

MfG


Th69 - Mi 09.11.11 13:12

Hallo,

du könntest über das 'sender'-Objekt (welches deinem Button entspricht) mittels der Parent-Eigenschaft auf dein Item zugreifen (bzw. hochiterieren).
Beachte, daß du explizit auf das Control bzw. FrameworkElement casten mußt (Stichwort: as).


ebber - Mi 09.11.11 15:46

Das hatte ich schon versucht, aber ich glaube nicht, dass das geht:


C#-Quelltext
1:
2:
var ss = (sender as Button).Parent;
var sss = (ss as StackPanel).Parent;


Über dem Button ist ein StackPanel, allerdings hat das kein Parent mehr!? Es kommt zumindest sss = null raus.


Th69 - Mi 09.11.11 19:49

Hallo ebber,

laut dem letzten Beitrag in http://www.xing.com/net/net_entwicklung/wie-geht-das-8707/wpf-problem-mit-selecteditem-bei-listbox-in-verwendung-eines-usercontrol-als-itemtemplate-21846640 muß man den VisualTree heraufwandern:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
// Liefert das erste Vorkommen eines DependencyObjects des angebenen Typs im VisualTree nach oben suchend:
private DependencyObject GetNextVisualParentOfType(DependencyObject startObject, Type type)
{
  DependencyObject parent = startObject;
  while (parent != null)
  {
    if (type.IsInstanceOfType(parent))
      break;
    else
      parent = VisualTreeHelper.GetParent(parent);
  }
  return parent;
}

Aufruf dann in etwa so:

C#-Quelltext
1:
ListBoxItem currentListBoxItem = GetNextVisualParentOfType(sender, typeof(ListBoxItem)) as ListBoxItem;                    


War nur der falsche Parent, den ich dir genannt habe ;-)


ebber - Mi 09.11.11 20:27

Danke, die Funktion funktioniert mit:


C#-Quelltext
1:
2:
ListBoxItem currentListBoxItem = GetNextVisualParentOfType(sender as Button, typeof(ListBoxItem)) as ListBoxItem;
var dataContext = currentListBoxItem.DataContext; //o. Ä.


Allerdings bin ich dabei auf eine andere Lösung gestoßen, die um einiges einfacher scheint:

C#-Quelltext
1:
2:
Button button = sender as Button;
var dataContext = button.DataContext;

komisch, dass das auch funktioniert.

Aufjedenfall bekomme ich auf beide Weisen meine gebindete Klasse zurück.

Danke.

MfG


ujr - Do 10.11.11 10:02

user profile iconebber hat folgendes geschrieben Zum zitierten Posting springen:


C#-Quelltext
1:
2:
Button button = sender as Button;
var dataContext = button.DataContext;

komisch, dass das auch funktioniert.

Aufjedenfall bekomme ich auf beide Weisen meine gebindete Klasse zurück.


Das ist überhaupt nicht komisch, sondern liegt im Prinzip der WPF-Datenbindung.

Und wenn Du, anstatt mit dem Click-Ereignis, mit Button.Command und MVVM-Muster (Model-View-ViewModel) [http://msdn.microsoft.com/de-de/magazine/dd419663.aspx] arbeitest, wirst Du sehen, dass Du noch viel einfacher an Deine gebundene Klasse kommst.


ebber - Do 10.11.11 13:54

Mir scheint WPF ist fast mehr zu lernen als C#. Wobei man ja schon fast auf C# verzichten kann. Man denke nur mal an Schleifen zur Datendarstellung :)

Wobei ich mich dann frage wieso überhaupt jemand mit etwas anderem arbeitet, wenn man sieht was alles mit WPF & .NET möglich ist.