neues Tab im TabControl aktivieren

MorphieX
Hi,

ich habe ein TabControl mit einem Tab, auf dem sich ein DataGrid befindet.
Jetzt möchte ich über ein RelayCommand-Objekt ein neues Tab zur Laufzeit erzeugen.
Dieses Tab soll dann auch automatisch als SelectedItem aktiviert werden.

Das RelayCommand-Objekt führt folgenden Code aus

C#-Code:
private void Add()
{
    PartnerDetailsTabItem tab = new PartnerDetailsTabItem();
    TabControl1.Items.Add(tab);
    TabControl1.SelectedItem = tab;
}

Binde ich das RelayCommand z.B. an einen Button klappt das wunderbar. Das neue Tab erscheint im TabControl und wird sofort aktiviert.

Jetzt möchte ich aber die gleiche Funktionalität haben, wenn ich einen Doppelklick auf das DataGrid mache.

Weil es dafür ja keine entsprechende Command-Eigenschaft gibt, habe ich das erstmal über das Ereignis "MouseDoubleClick" vom DataGrid in der CodeBehind-Datei gemacht:

C#-Code:
private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    Add();
}

Dabei wird das TabItem dem TabControl hinzugefügt, aber nicht aktiviert?!

Weiß jemand, woran das liegen könnte und wie ich diesen Effekt umgehen kann?
MatthiasDietschweiler
Dein Focus liegt während dem Event auf dem Grid. Ev. musst du zuerst das TabContdrol fokusieren und erst dann das selectedItem zuweisen.
MorphieX
Leider brachte das keine Besserung... :-(
Habe es in zig verschiedenen Kombinationen ausprobiert...

Selbst das funktioniert nicht:
1. Tab entfernen
2. Tab Hinzufügen
2. Tab aktivieren (bis hier hin klappts)
1. Tab wieder hinzufügen

Anschließend ist der 1. Tab wieder aktiv?! selbst wenn ich nach jeder Zeile den Fokus auf das TabControl oder direkt auf Tab2 setze bleibt anschließend der 1. Tab immer aktiv...

Hat jemand noch ne Idee?
Nava
Hallo,

Mein Tip ist das

C#-Code:
TabControl1.SelectedItem = tab;

ins Leere läuft. Weil deine Klasse "PartnerDetailsTabItem" die Methode "Equals" nicht überschrieben hat. Kurz gesagt er findet keine passendes Tab.

Alternativ könntest du auch folgendes machen:

C#-Code:
tabControl1.SelectedIndex = tabControl1.Items.Count -1 ;

Viele Grüße,
Nava
MorphieX
Leider auch nicht... Habe ich auch schon probiert...

Ich konnte nun feststellen, dass das ganze nur bei "CollectionControls" (?) auftritt... Also Controls, die Collections halten können (DataGrid, ListBox,...)
Nehme ich stattdessen einen Button oder eine CheckBox oder anderes Control, klappt es wunderbar... Ich brauche aber ein DataGrid...
Nava
Hi,

Ich kann deinen Fehler nicht nachvollziehen.
Ich habe es grade getestet und es funktioniert.

C#-Code:
private void button1_Click(object sender, RoutedEventArgs e)
        {
            DataGrid  tab = new DataGrid();
            tabControl1.Items.Add(tab);
            tabControl1.SelectedIndex = tabControl1.Items.Count -1 ;
        }

Kannst du bitte den Quelltext der Classe "PartnerDetailsTabItem" posten.
MorphieX
Ich glaube da hast du mich falsch verstanden...

1. möchte ich kein DataGrid als Tab einfügen, sondern von einem DataGrid aus ein neues TabItem hinzufügen.
2. funktioniert das ganze über einen Button reibungslos. Nur von "CollectionControls" wie z.B. dem DataGrid aus nicht. Dort will ich das Ereignis "MouseDoubleClick" nutzen, um ein neues TabItem an das TabControl anzuhängen.

Ich habe mal ein minimales Beispielprojekt angehängt, bei dem man die Problematik sehen sollte...
Gwinn
Hi MorphieX,

spendier deinem EventHandler noch ein

C#-Code:
e.Handled=true;

Dann sollte es auch klappen.

C#-Code:
private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
     AddTabItem();
     e.Handled = true;
}

Gruß Gwinn
MorphieX
So klappts... ;-)

So klug wie ich war, habe ich mein Problem aufs "wichtigste" beschränkt...
Mit einem normalen DataGrid klappts also...

Ich verwende in wirklichkeit aber das GridControl von DevExpress. Hier habe ich ein Event

C#-Code:
tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)

C#-Code:
e.handled = true;

habe ich schon ausprobiert und es hat bei dem Grid nicht funktioniert.
Daher dachte ich, dass das keine Lösung ist. Beim normalen DataGrid habe ich das deshalb auch nicht mehr weiter verfolgt...

Mein bisheriger Code:

C#-Code:
private void tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)
{
    Add();
    e.Handled = true;
}

Damit klappt es nicht...
Ich habe es jetzt aber trotzdem geschafft...

Für alle, die das gleiche Problem haben:
Man muss im Event tableView1_MouseDoubleClick das e.Handled auf true setzen, nicht im tableView1_RowDoubleClick.

Also so:

C#-Code:
private void tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)
{
    Add();
}

private void tableView1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

Ich danke allen, die mir bei dem Problem geholfen haben! ;) Nächstes Mal stelle ich die Frage direkt konkreter... :-)