Siverlight 4, MVVM и ItemsControl ZIndex - PullRequest
2 голосов
/ 09 июня 2011

Я создаю приложение с поддержкой перетаскивания и пытаюсь использовать ItemsControl для привязки вместо добавления элементов управления по умолчанию.Displayer - это UserControl, представляющий объект, с которым я работаю.

ZExtender имеет свойства ZIndex, Top, Left и т. Д.Реализация ниже работает правильно для верхнего, левого, ширины, но изменения ZIndex не вступают в силу.Я хочу привязать или изменить ZIndex в коде, чтобы автоматически изменить его в пользовательском интерфейсе.Возможно ли это без использования обмена сообщениями с 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 Ответ

1 голос
/ 09 июня 2011

Я удивлен, что свойства 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 не поддерживает привязки в сеттерах, подобных этому. Таким образом, вы должны применить привязки в коде позади. Предпочтительно в PrepareContainerForItemOverride .

Или вы можете попробовать обходной путь, описанный здесь .

...