Search code examples
c#wpfitemcontainergenerator

Find host from ItemContainerGenerator.itemChanged Event


I'm working on C# 4.0, WPF. I have three ListView, and all three controls have the same ItemContainerGenerator_ItemsChanged" event handler. So my problem is that I want to find the host ListView from within the event handler.

lst1.ItemContainerGenerator.ItemsChanged += new System.Windows.Controls.Primitives.ItemsChangedEventHandler(ItemContainerGenerator_ItemsChanged);

lst2.ItemContainerGenerator.ItemsChanged += new System.Windows.Controls.Primitives.ItemsChangedEventHandler(ItemContainerGenerator_ItemsChanged);

lst3.ItemContainerGenerator.ItemsChanged += new System.Windows.Controls.Primitives.ItemsChangedEventHandler(ItemContainerGenerator_ItemsChanged);


void ItemContainerGenerator_ItemsChanged(
    object sender,
    System.Windows.Controls.Primitives.ItemsChangedEventArgs e)
    {
        //TODO: Find ListView instance.
        // **REAL Problem**
        // ListViewItem's Visible property has been set based on the deletion
        // button click, so at one place i have to get the count of rows which
        // are visible and proceed with related buttons enable/disable operation.
    }

Solution

  • The simplest solution would be to use lambdas as event handlers so that you can forward the ListView instance to your "real" handler.

    lst1.ItemContainerGenerator.ItemsChanged += 
        (o, e) => this.ListViewGeneratorItemsChanged(o, e, lst1);
    
    lst2.ItemContainerGenerator.ItemsChanged += 
        (o, e) => this.ListViewGeneratorItemsChanged(o, e, lst2);
    
    lst3.ItemContainerGenerator.ItemsChanged += 
        (o, e) => this.ListViewGeneratorItemsChanged(o, e, lst3);
    
    void ListViewGeneratorItemsChanged(object sender, ItemsChangedEventArgs e, ListView listView)
    {
        // We have the ListView and also the ItemContainerGenerator (in sender)
    }