Question

Using Caliburn.Micro for a WinRT application, I would like to control the ZIndex of items displays in an ItemsControl. When a user taps on an item, it should become the topmost element.

        <ItemsControl Background="White" Height="auto" Width="auto"  x:Name="Parts"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Top" 
                      >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                        <Canvas></Canvas>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>

The viewmodel bound to the view above contains a property Parts:

    private BindableCollection<IPartViewModel> _parts = new BindableCollection<IPartViewModel>();
    public BindableCollection<IPartViewModel> Parts
    {
        get { return _parts; }
        set { _parts = value; NotifyOfPropertyChange(() => Parts); }
    }

IPartViewModel has different implementations, each with their own View (= custom user controls). Every implementation of IPartViewModel has a ZIndex property, ready to be bound.

All other bindings (labels, the tapped event, ...) work perfectly, but I cannot figure out what the binding should look like to control the ZIndex.

Many other questions on SO deal with this issue, but none for WinRT.

Was it helpful?

Solution

I ended up achieving this with a custom ItemsControl and overriding the method GetContainerForItemOverride where I return a ContentPresenter with a binding added to the ZIndex property

protected override DependencyObject GetContainerForItemOverride()
        {
            var cp = new ContentPresenter();
            cp.SetBinding(Canvas.ZIndexProperty, new Binding { Path = new PropertyPath("ZIndex") });
            return cp;
        }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top