将装饰器添加到绑定的孩子?

时间:2011-10-31 00:40:29

标签: c# wpf xaml adorner

<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>

这是我的代码。没有问题。我创建了一个装饰,我想在我想要的时候为每个按钮添加一个装饰。这有点困难,因为我不知道如何获得按钮。 CanvasTableMap.Items返回Model,所以我不知道如何有效地访问控件。

2 个答案:

答案 0 :(得分:0)

您可以使用ItemContainerGenerator来获取根据数据创建的控件(ContainerFromItem)。通常以这种方式做事并不是一个好主意。

答案 1 :(得分:0)

一种简单的方法是为按钮的Loaded事件定义处理程序,并在该处理程序中添加装饰器:

<强> XAML

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

<强>代码隐藏

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

    // Add the adorner
    ...
}

如果您不想使用代码隐藏,则可以创建附加行为(使用System.Windows.Interactivity或创建附加属性)