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
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:
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?
Dein Focus liegt während dem Event auf dem Grid. Ev. musst du zuerst das TabContdrol fokusieren und erst dann das selectedItem zuweisen.
Leider brachte das keine Besserung... 😦
Habe es in zig verschiedenen Kombinationen ausprobiert...
Selbst das funktioniert nicht:
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?
Hallo,
Mein Tip ist das
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:
tabControl1.SelectedIndex = tabControl1.Items.Count -1 ;
Viele Grüße,
Nava
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...
Hi,
Ich kann deinen Fehler nicht nachvollziehen.
Ich habe es grade getestet und es funktioniert.
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.
Ich glaube da hast du mich falsch verstanden...
Ich habe mal ein minimales Beispielprojekt angehängt, bei dem man die Problematik sehen sollte...
Hi MorphieX,
spendier deinem EventHandler noch ein
e.Handled=true;
Dann sollte es auch klappen.
private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
AddTabItem();
e.Handled = true;
}
Gruß Gwinn
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
tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)
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:
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:
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... 😃