数据绑定到Silverlight ContentControl时未触发鼠标事件

数据绑定到Silverlight ContentControl时未触发鼠标事件,silverlight,data-binding,silverlight-4.0,Silverlight,Data Binding,Silverlight 4.0,我正在获取一个Silverlight 4用户控件,该控件包含一个画布,画布上有许多框架元素,并将其转换为使用数据绑定 我的原始画布的XAML是: <Canvas x:Name="panelDisplay" > <Rectangle Width="50" Height="50" MouseLeftButtonDown="Element_MouseLeftButtonDown" Stroke="Aqua" StrokeThickness="5" Fill="Aquamari

我正在获取一个Silverlight 4用户控件,该控件包含一个画布,画布上有许多框架元素,并将其转换为使用数据绑定

我的原始画布的XAML是:

<Canvas x:Name="panelDisplay" >
    <Rectangle Width="50" Height="50" MouseLeftButtonDown="Element_MouseLeftButtonDown" Stroke="Aqua" StrokeThickness="5" Fill="Aquamarine" Canvas.Left="450" Canvas.Top="50" x:Name="rect1" />
    <Image Source="../Images/3.jpg" Stretch="UniformToFill" Width="356" Height="224" MouseLeftButtonDown="Element_MouseLeftButtonDown" Canvas.Left="317" Canvas.Top="140" x:Name="image1" />
</Canvas>
ElementContent用于存储矩形或图像。我填充一个名为CanvasElements的ObservableCollection,并分配控件的DataContext。我已将我的XAML更改为:

<Canvas x:Name="panelDisplay" >
    <ItemsControl x:Name="CanvasElements" ItemsSource="{Binding Path=CanvasElements}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Canvas>
                    <ContentControl Content="{Binding Path=ElementContent}" Height="{Binding Path=Height}" Width="{Binding Path=Width}" 
                                Canvas.Left="{Binding Path=Left}" Canvas.Top="{Binding Path=Top}"
                                MouseLeftButtonDown="CanvasElement_MouseLeftButtonDown" />
                </Canvas>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Canvas>

我的元素出现了,但CanvasElement_MouseLeftButtonDown没有开火。我还在ItemsControl中使用了ContentControl

我的问题是:

这是明智的做法吗


为什么MouseLeftButtonDown没有启动?

最好将MouseLeftButtonDown事件处理程序放在ItemsControl上。发生在孩子身上的任何事件都会让孩子们兴奋起来,你可以在那里处理他们

我最终决定,使用ItemsControl绑定到一组形状并不是最好的方法

这样做的主要原因是,通过在DataTemplate中使用控件来容纳形状增加了额外的复杂性,在我的例子中,我有一个主画布,每个形状都被放置在主画布上自己的画布中


我相信这会导致事件出现问题,并使形状定位更加复杂。

您好,MouseLeftButtonDown不会启动,因为您已在ItemsControl的datatemplate中定义了它。感谢Malcolm-在这种情况下,我应该将事件处理程序放在哪里。您在这个ContentControl中包含哪些内容?可能是鼠标事件没有弹出内容控件以触发事件。目前,内容控件的内容是矩形或图像,但将来将是其他形状。如果我在ItemsControl上放置处理程序,它仍然不会触发。如果我将处理程序放在父画布上(而不是DataTemplate中的画布),则会触发。
<Canvas x:Name="panelDisplay" >
    <ItemsControl x:Name="CanvasElements" ItemsSource="{Binding Path=CanvasElements}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Canvas>
                    <ContentControl Content="{Binding Path=ElementContent}" Height="{Binding Path=Height}" Width="{Binding Path=Width}" 
                                Canvas.Left="{Binding Path=Left}" Canvas.Top="{Binding Path=Top}"
                                MouseLeftButtonDown="CanvasElement_MouseLeftButtonDown" />
                </Canvas>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Canvas>