WPF Register SelectionChanged Event

Hey,

I am making a dockable panel and I want to show some data of the currently selected element in revit.
I’ve looked and read a lot on this forum about the topic but can’t seem to figure it out.
I think i need to use the SelectionChanged Event but don’t know how to implement it.
I’m kinda new to using classes so im still learning.

This is my code so far.
The panel is visible and works great with the xaml.

import System
import os.path as op
from pyrevit import HOST_APP, framework, coreutils, PyRevitException
from pyrevit import revit, DB, UI
from pyrevit import forms, script
from pyrevit.framework import wpf, ObservableCollection
from System.Windows.Media import Brushes


sample_panel_id = "1458b7cb-4dbe-4a8e-bad3-837e14b0a1ca"
warnings_list = []

class _WPFPanelProvider(UI.IDockablePaneProvider):
    def __init__(self, panel_type, default_visible=True):
        self._panel_type = panel_type
        self._default_visible = default_visible
        self.panel = self._panel_type()

    def SetupDockablePane(self, data):
        data.FrameworkElement = self.panel
        data.VisibleByDefault = self._default_visible

def register_dockable_panel(panel_type, default_visible=True):
    if not issubclass(panel_type, forms.WPFPanel):
        raise PyRevitException(
            "Dockable pane must be a subclass of forms.WPFPanel"
            )

    panel_uuid = coreutils.Guid.Parse(panel_type.panel_id)
    dockable_panel_id = UI.DockablePaneId(panel_uuid)
    panel_provider = _WPFPanelProvider(panel_type, default_visible)
    HOST_APP.uiapp.RegisterDockablePane(
        dockable_panel_id,
        panel_type.panel_title,
        panel_provider
        )
    return panel_provider.panel



class DockableExample(forms.WPFPanel):
    panel_source = op.join(op.dirname(__file__), "MainWindow.xaml")
    panel_title = "Dockable Pane Sample"
    panel_id = "3110e336-f81c-4927-87da-4e0d30d4d64a"

    def CheckBox_Checked_1(self, sender, args):
        forms.alert("1")
    def CheckBox_Unchecked_1(self, sender, args):
        forms.alert("2")
        
    def ButtonClicked_1(self, sender, args):
        with open("L:/REVIT/PyRevit/HEK_Toolbars/Tab H-ALG/H-ALG.extension/H-ALG.tab/Algemeen.panel/WerkInstructies.pushbutton/script.py") as f:
           exec(f.read())
        
        forms.alert("3")
        
    def CheckBox_Checked_2(self, sender, args):
        forms.alert("4")
    def CheckBox_Unchecked_2(self, sender, args):
        forms.alert("5")


    def CheckBox_Checked_3(self, sender, args):
        forms.alert("6")           
    def CheckBox_Unchecked_3(self, sender, args):
        forms.alert("7")

    def ComboBoxUpdated_1(self, sender, args):
        forms.alert("8")
    
    def WriteText1(self, sender, args):
        forms.alert("9")
    def WriteText2(self, sender, args):
        forms.alert("10")
    def WriteText3(self, sender, args):
        forms.alert("11")



registered_panel = register_dockable_panel(DockableExample)

Hi @MelleH,

You’re right about using the SelectionChanged event.

You just need to create a function (or a method of your panel class) with a single input argument, that will be of SelectionChangedEventArgs type, from which you can access the selection.

Then, you have to register that method during your panel initialization

HOST_APP.uiapp.SelectionChanged += my_function_name

And remember to remove the handler when you close the panel

HOST_APP.uiapp.SelectionChanged -= my_function_name

This is the theory, I don’t know If IronPython is fine with this, never tried it myself :sweat_smile:

2 Likes