TabControl SelectedTab Binding

  • WPF

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von HamburgerJungeJr.

    So, ich hab noch einiges an Architektur gepimpt und aufgeräumt.
    Ich empfehle, bisserl mehr bei den Standards zu bleiben: Partial hab ich daher "View" genannt, und gehört Xaml hinein, was Viewmodel anzeigt. Das hab ich noch nicht perfektioniert, etwa Ribbon und StartRibbonTab etc. sind auch noch drin - möglicherweis muss man einen weiteren Ordner "Xaml" anlegen, wo zunächt nicht zuordnebares Xaml reinkommt.
    Hersteller und Fahrzeug hab ich aus Data raus, ins Viewmodel hinein - was sonst?
    RelayCommand ist Infrastruktur, ist bestimmt kein Viewmodel, aber MainViewmodel ist Viewmodel.
    Und MainWindow ist natürlich View.
    Dem View hab ich uclFahrzeug, uclHersteller zugefügt, und dort kannst du unter Nutzung von MVVM: "Binding-Picking" im Xaml-Editor deren View wirklich gestalten.
    BindingPicking wird ermöglicht durch Einsatz des d-Namespaces, und der d-Namespace unterstützt auch Mocking, also du kannst BeispielViewmodels erzeugen, die im Designer sichtbar werden, wenn die Bindings stimmen - ähnlich wie im Tut gezeigt.
    Dateien
    Ich habe das jetzt nach deinen Vorschlägen verändert, allerdings besteht mein Ausgangsproblem immer noch. Ich bekomme den aktuellen Tab nicht an das ViewModel gemeldet bzw. vom ViewModel gesetzt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „HamburgerJungeJr“ ()

    ich schon, wenn ich will ;)

    C#-Quellcode

    1. public MainViewModel() {
    2. ds = new HcfData();
    3. tabsCollection = (ListCollectionView)CollectionViewSource.GetDefaultView(tabs);
    4. NewTab = new RelayCommand(addTab);
    5. NewTab2 = new RelayCommand(addTab2);
    6. tabsCollection.CurrentChanged += tabsCollection_CurrentChanged;
    7. }
    8. void tabsCollection_CurrentChanged(object sender, EventArgs e) {
    9. MessageBox.Show(tabsCollection.CurrentItem.ToString());
    10. }
    jo - 2 Dinge:

    C#-Quellcode

    1. void tabsCollection_CurrentChanged(object sender, EventArgs e) {
    2. if (tabsCollection.CurrentItem!=null) MessageBox.Show(tabsCollection.CurrentItem.ToString());
    3. }

    XML-Quellcode

    1. <TabControl ItemsSource="{Binding Tabs}" Grid.Row="0" Grid.ColumnSpan="2" DisplayMemberPath="DataRow.Id" IsSynchronizedWithCurrentItem="True">
    ich weiß grad nicht, wovon du redest. Code?

    Edit: Ich hab jdfs. kein Problem mit

    C#-Quellcode

    1. private RelayCommand _CmdTest;
    2. public RelayCommand CmdTest { get { return _CmdTest ?? (_CmdTest = new RelayCommand(()=>tabsCollection.MoveCurrentToFirst())); } }
    und daran einen Testbutton binden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich versuchs nochmal zu erklären:

    Ich wollte den neu hinzugefügten Tab als Aktiven setzen. Also habe ich mir die Methoden angesehen und MoveCurentTo(object) gefunden. Übergebe ich dieser Methode jetzt meinen gerade hinzugefügten Tab, passiert nichts. Verwende ich aber stattdessen MoveCurrentToFirst() funktioniert das ganze, also der erste Tab wird Aktiv.

    Ich hatte also die Idee, dass MoveCurrentTo() den Tab nicht finden kann. Also habe ich mit Tabs.Contains(<MeinTab>)


    Habe jetzt beim Schreiben gerade den Fehler gefunden: Ich habe der ObservableCollection ein Fahrzeug hinzugefügt und MoveCurrentTo die DataRow übergeben. :/