Commandbinding buttona z TreeViewItem i referencja do tego TreeViewItem

0

Witam przy pomocy HierarchicalDataTemplate utworzyłem sobie taką strukturę:

<TreeView ItemsSource="{Binding League}"> 
    <!-- Conference teamplate -->
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Teams}">
            <TextBlock Foreground="Red" Text="{Binding Name}" />
            <Button Name="Wyslij" Command="C_WYSLIJ" />
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>         
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView> 

W powyższym kodzie możecie zauważyć że jest na pewnym poziomie mam kontrolkę BUTTON i przypisane do niej polecenie COMMAND. I tu pojawia się problem bo w obsłudze commanda chce obsłużyć obiekt klasy, do którego należy treeviewitem na którym jest umiejscowiony ten button.

Próbowałem z wydobyciem poziomu np. za pomocą takiego kodu

Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2}, Path=DataContext.Name} ale zwraca on mi tylko wartość dla "Name" a ja potrzebuje referencji do obiektu (kombinowałem też z poziomami ancestora), jak zamieniłem x:Type na x:reference to program mi się sypał.

Jak pobrać referencje do obiektu przy korzystaniu z commandbindinga, do którego to obiektu jest przypisana kontrolka button (Dla danego elementu drzewa) ?

0

rozwiązałem sam.

poniżej kilka słów dla potomnych, którzy kiedyś trafią tutaj z wyszukiwarki :)

Jeżeli checie korzystać z drzewa hierarchicznego w taki sposób jak ja powyżej z CommandBindings i w obsłudze zdarzenia mieć referencje ("odnośnik") do oryginalnego obiektu, z którego było wywołanie, czyli w moim przypadku drzewo ma max 1 poziom i e.Source zwróci mu TreeView (co nic nam nie daje) a e.OrginalSource zwróci nam Button, co także nic nam (chyba no chyba że się da coś kombinować z rodzicami/dziećmi i innymi kontenerami, ale na dzień dzisiejszy nie wiem jak i nie będę się o tym rozpisywać) nie da. A więc jako CommandParameter (dla Buttona) dajemy to:

CommandParameter={Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=1}, Path=DataContext.Name}

Potem w kodzie obsługi commanda robimy rzutowanie parametru na obsługiwaną klasę np. klasę "User":

User usr = e.Parameter as User;

w taki sposób modyfikując wartości składowe obiektu usr edytujecie jego orginalny obiekt, bo usr jest do niego referencją.

Jeżeli tak będzie edytować i liste obiektów macie utworzoną jako listę ( ;) ) czyli List<User> to modyfikacje nie będą dla was widoczne, a więc należy zmienić to z List na "ObservableCollection" - czyli podmnieniamy na chama List z ObservableCollection oraz dodajemy using System.Collections.ObjectModel;

i wsio, jak nie działa to schrzaniliście coś innego, pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1