Silverlight 4,MVVM和ItemsControl Z索引

时间:2011-06-09 18:31:49

标签: silverlight silverlight-4.0 mvvm itemscontrol

我正在创建一个支持拖放的应用程序,我一直在尝试使用ItemsControl进行绑定,而不是默认添加我的控件。 Displayer是一个UserControl,代表我正在使用的对象。

ZExtender具有ZIndex,Top,Left等属性。下面的实现正确地适用于顶部,左侧,宽度,但ZIndex更改不会生效。我想在代码中绑定或更改ZIndex以在UI中自动更改它。如果不使用消息传递到我的页面的codeBehind,这可能吗?

  <Border BorderBrush="Black" BorderThickness="2" Margin="35" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Canvas AutomationProperties.AutomationId="designerCanvas" Width="{Binding Root.Width}" Height="{Binding Root.Height}">
               <Canvas.Background>
                  <ImageBrush ImageSource="/SilverlightImages/canvasBackground.png" Stretch="None" />
               </Canvas.Background>
               <ItemsControl ItemsSource="{Binding Containers}">
                    <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                  <ItemsControl.ItemTemplate>
                     <DataTemplate>
<canvas> <!-- canvas is needed for the positioning to work -->
                        <controls:Displayer DataContext="{Binding ZExtender}"
                                                Canvas.Top="{Binding Top}"
                                                Canvas.Left="{Binding Left}" 
                                                Canvas.ZIndex="{Binding ZIndex}" 
                                                Width="{Binding WidthInPixels}"
                                                Height="{Binding HeightInPixels}"
                                                 />
</canvas>
                     </DataTemplate>
                  </ItemsControl.ItemTemplate>
               </ItemsControl>          
            </Canvas>  
         </Border>

1 个答案:

答案 0 :(得分:1)

我很惊讶Top / Left属性的工作。 Canvas查看它是Top / Left / ZIndex附加属性的直接子项。给定非UIElement对象,Canvas将项目包装在ContentPresenter中(它成为Canvas的直接子项)。因此,Canvas将查看ContentPresenter,而不是ZExtender或Displayer控件。

将创建Displayer控件并将其添加为ContentPresenter的子级。但这与Canvas无关。

通常情况下,您需要执行以下操作:

<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Canvas.Left" Value="{Binding Left}" />
        <Setter Property="Canvas.Top" Value="{Binding Top}" />
        <Setter Property="Canvas.ZIndex" Value="{Binding ZIndex}" />
    </Style>
</ItemsControl.ItemContainerStyle>

但Silverlight 4不支持Setters中的绑定。所以你必须在后面的代码中应用绑定。最好在PrepareContainerForItemOverride

或者您可以尝试here所述的解决方法。