Myślisz, że zarabiasz tyle, na ile zasługujesz? Zapraszamy do wzięcia udziału w anonimowej ankiecie.
1

Generalnie sam nie wiem jak Wam to logicznie wytłumaczyć.

Może zacznę od kontekstu. Mam sobie programik, swego rodzaju edytor xml`a. Jak można się domyślać, poszczególne edytowane dokumenty otwierane są w zakładkach TabControl. Jako menu aplikacji używam Ribbona (wersji od Microsoftu). Na ribbonie mam przycisk, który wykonuje akcję na dokumencie z aktualnej zakładki.

Na czym polega problem. Mam otwarty PlikA. Otwieram teraz PlikB, pojawia się nowa aktywna zakładka. Klikam w nagłówek zakładki A, staje się ona aktywna. Wciskam przycisk na ribbonie i akcja się nie wywołuje, w zamian za to aktywna zostaje zakładka B :)
Zielonego pojęcia nie mam czemu się tak dzieje i liczyłbym na jakiś pomysł z Waszej strony.
Przejrzałem kod pod kątem ręcznego ustawiania aktywnej zakładki - to chyba nie to.

Jako ciekawostki dorzucę jeszcze dwa fakty
* handler podpięty pod żądaną akcję się nie wykonuje
* każda zakładka ma edytor kodu, będący winformsową kontrolką hostowaną w WindowsFormsHost. Jeżeli otworze plikB, przejde do zakładki A i zanim wykonam akcję z ribbona, kliknę w edytorze kodu wszytko jest w jak najlepszym porządku.

Jeżeli macie jakieś sugestie gdzie leży błąd, lub gdzie go szukać chętnie poczytam :) Mnie kończą się pomysły.

Z góry dziękuje!

Edit:
Przepraszam za zwłokę.
Problem jest na tyle dla mnie nietypowy, że ciężko mi zaproponować fragment kodu

W xaml zdefiniowana kontrolka jest w dość oczywisty sposób:

        <TabControl Grid.Column="2" Grid.Row="0" Name="tabDocuments" Margin="10" MinHeight="100" MinWidth="100" IsSynchronizedWithCurrentItem="True" IsTabStop="False"
                    SelectionChanged="TabDocuments_SelectionChanged" PreviewMouseDown="TabDocumenta_PreviewMouseDown" >
            <TabControl.Effect>
                <DropShadowEffect/>
            </TabControl.Effect>
        </TabControl>

Od razu zaznaczam, że ten sam efekt ma miejsce jeżeli odepnę widoczne handlery.

Akcja pod przyciskiem:

                <r:RibbonCommand    x:Key="cmdExecuteTransform"
                                Executed="CmdExecuteTransform"
                                CanExecute="CmdExecute_CanExecute"
                                LabelTitle="{x:Static loc:UIStrings.btnExecuteTransform_Label}"
                                LabelDescription="{x:Static loc:UIStrings.btnExecuteTransform_Description}"
                                LargeImageSource="Images/Transform.png"
                                SmallImageSource="Images/Small/Transform.png"
                                />

Metoda podpięta pod Executed nie dochodzi do skutku. Natomiast CanExecute wygląda następująco:

    private void CmdExecute_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        if (_currentTabData == null)
        {
            e.CanExecute = false;
            return;
        }

        if (_currentTabData.Type != Consts.TabType.Designer)
        {
            _currentTabData.Type = GetTabType(_currentTabData.OpenedFilePath, GetCodeBoxFromActiveTab());
        }

        e.CanExecute = (_currentTabData.Type == Consts.TabType.XmlDocument) || (_currentTabData.Type == Consts.TabType.XsdDocument) ? false : true;
    }

    private CodeBox GetCodeBoxFromActiveTab()
    {
        return GetCodeBoxFromTab((TabItem)tabDocuments.SelectedItem);
    }

    private CodeBox GetCodeBoxFromTab(TabItem tabItem)
    {
        if (tabItem != null)
        {
            CodeBox codeEditor = tabItem.Content as CodeBox;

            if (codeEditor != null)
            {
                return codeEditor;
            }
            else
            {
                Designer designer = tabItem.Content as Designer;
                if (designer != null)
                {
                    return designer.CodeBox;
                }
            }
        }

        return null;
    }

Wydaje mi się, że akcja Execute się nie wykonuje, ponieważ w momencie jej wywołania, aktywna jest już spowrotem zakładka z PlikiemB, na której transformacja nie jest zasadna i przycisk powinien być wyłączony.

Tylko, czemu ta zakładka sama się zmienia?

flag
1 
a moze troche kodu zrodlowego? – Karol Sotomski Mar 2 at 10:54

1 Answer

0

W jaki sposob wypelniasz TabControl zakladkami? Sprobuj wylaczyc IsSynchronizedWithCurrentItem. Mialem kiedys cos podobnego z comboboxem i okazalo sie, ze zle synchronizuje elementy kontrolki (CollectionView) z kolekcja obiektow biznesowych.

No i upewnij sie czy aby na pewno aktywna jest ta zakladka, co myslisz :) Przedebugowanie CanExecute powinno pomoc.

Niestety nie mam lepszych pomyslow...

link|flag
Zakładki dodaje w kodzie poprzez tabDocuments.Items.Add(newTabItem); Bez bindowania do kolekcji. Wyłączenie IsSynchronizedWithCurrentItem próbowałem, lecz nie pomogło. Jeśli chodzi o 'aktywność' zakładki, to nie jest to równoznaczne, z tym że jest widoczna? – Biegal Mar 3 at 17:17
W sensie, widze przed oczami zakładkę B. Klikam w header zakładki A, pojawia się zawartość zakładki A na pierwszym planie. Jest ok. Zakładam, że w tym momencie tabControl.SelectedItem powinien wskazywać zakładkę A. Niestety przy wciśnięciu przycisku, samoczynnie przeskakuje na zakładkę B, i CanExecute widzi już zakładkę B. – Biegal Mar 3 at 17:20
A probowales sie breakowac w GetCodeBoxFromActiveTab? Jesli to nie jest rozsynchronizowanie widoku i kolekcji itemow, to musi strzelac zdarzenie SelectedItemChanged. – Karol Sotomski Mar 3 at 22:03
co to jest _currentTabData i skad sie bierze? – Karol Sotomski Mar 3 at 22:22
To tak, żadna akcja na CanExecute tu nie miesza, wyłączyłem wszystkie i problem wciąż się powtarzał. Jako, że wyłączyłem CanExecute mogłem odpalić breaka na wejściu akcji podpiętej pod przycisk. Efekt jest taki, że na samym wejściu TabControl.SelectedItem wskazuje już na zakładkę B zamiast na A. Jak się wyświetli okno, widać już zakładkę B, choć nie do końca wyrenderowaną (bez zawartości). _currentTabData to obiekt przechowujący informacje o danej zakładce i jest raczej bez powiązania z problemem – Biegal Mar 8 at 15:31

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.