Search code examples
c#wpfxamladorner

Add adorner to bound children?


<ItemsControl Name="CanvasTableMap" ItemsSource="{Binding}" ItemsPanel="{DynamicResource ItemsPanelTemplate1}" ItemTemplate="{DynamicResource DataTemplate1}">
    <ItemsControl.Resources>
        <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
            <WrapPanel   Background="{DynamicResource ContentBackground}" />        
        </ItemsPanelTemplate>
        <DataTemplate x:Key="DataTemplate1">
            <Button Canvas.Left="100"  Content="{Binding Name}" Template="{DynamicResource ButtonTableTemplate}"></Button>
        </DataTemplate>
    </ItemsControl.Resources>       
</ItemsControl>

Here is my code.No problem with that. I have created an adorner and i would like to add an adorner for each button when i want. It is a little difficult as i dont know how to get the Buttons. CanvasTableMap.Items returns the Model so i dont know how to get access to the controls efficiently.


Solution

  • An easy way to do that is to define a handler for the Loaded event of the button, and add the adorner in that handler:

    XAML

    <Button Canvas.Left="100"  Content="{Binding Name}" ... Loaded="Button_Loaded" />
    

    Code-behind

    private void Button_Loaded(object sender, RoutedEventArgs e)
    {
        var button = (Button)sender;
        var layer = AdornerLayer.GetAdornerLayer(button);
    
        // Add the adorner
        ...
    }
    

    If you don't want to use code-behind, you can create an attached behavior (either with System.Windows.Interactivity or by creating an attached property)