binding windows-runtime itemscontrol winrt-xaml itemcontainerstyle

binding - ¿Cómo hago enlaces en ItemContainerStyle en WinRT?



windows-runtime itemscontrol (3)

Alternativas: Aquí hay otras oportunidades para adjuntar enlaces mediante código durante la creación del "Artículo" antes de la presentación.

ItemsControl.PrepareContainerForItemOverride http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.itemscontrol.preparecontainerforitemoverride.aspx

ListViewBase.ContainerContentChanging http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.listviewbase.containercontentchanging.aspx

Estoy intentando vincular una colección a un ItemsControl, con un lienzo como el panel de elementos y con el lienzo de cada elemento. Izquierda y superior vinculadas a las propiedades en los objetos del elemento. Básicamente estoy tratando de volver a crear el enlace de datos 2-D que describí en esta publicación en mi blog , pero esta vez en WinRT en lugar de WPF.

Dado que ItemsControl envuelve su contenido ItemTemplate en otro elemento UI (un ContentPresenter, en el caso de WinRT), y son esos elementos contenedor / contenedor que se colocan directamente dentro del panel de elementos, la Izquierda y la Superior deben establecerse en esos contenedores; no puedes simplemente configurarlos en DataTemplate. En WPF, es bastante fácil hacer esto con enlaces en ItemContainerStyle, por ejemplo:

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

Pero cuando intento lo mismo en un proyecto WinRT / XAML, no obtengo nada. Ni siquiera errores vinculantes. Si codigo un valor, funciona; pero si utilizo un enlace, la propiedad simplemente permanece en su valor predeterminado (cero) y no se muestran errores de enlace en la ventana de resultados.

<ItemsControl.ItemContainerStyle> <Style TargetType="ContentPresenter"> <!-- This works, so ItemContainerStyle does work in WinRT: --> <Setter Property="Canvas.Left" Value="200"/> <!-- But this silently fails, leaves Top as 0, and does not show any binding errors in the debugger''s Output window: --> <Setter Property="Canvas.Top" Value="{Binding Y}"/> </Style> </ItemsControl.ItemContainerStyle>

He verificado que los ContentPresenters tienen el DataContext correcto (es decir, el elemento de la colección, no la colección en sí o algo más funky), por lo que podría pensar que estas vinculaciones funcionarían bien. Pero ni siquiera parecen ser evaluados. Si pongo un enlace incorrecto en otro lugar y ejecuto una compilación de depuración, veo errores de enlace en la ventana de resultados del depurador; pero si hago referencia a una propiedad sin sentido dentro de ItemContainerStyle, no se muestran errores de enlace.

Aquí hay un ejemplo más completo, que (hasta donde sé) debería funcionar bien en WPF, pero eso deja todo en el origen en WinRT:

<ItemsControl ItemsSource="{Binding Tiles}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemContainerStyle> <Style TargetType="ContentPresenter"> <Setter Property="Canvas.Left" Value="{Binding DataContext.Left}"/> </Style> </ItemsControl.ItemContainerStyle> <ItemsControl.ItemTemplate> <DataTemplate> <Rectangle Width="80" Height="80" Fill="Gray"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>

He intentado algunas de las opciones más exóticas de Binding , específicamente RelativeSource . Cuando utilicé RelativeSource TemplatedParent , el comportamiento de "no hacer nada" no se modificó. Sin embargo, cuando usé RelativeSource Self , recibí un error vinculante, diciendo que la propiedad no existía en el tipo Setter . Es tomar ese Self un poco demasiado literalmente, allí.

También jugué con TemplateBinding , pero nunca asimilé para qué se usa, y todo lo que obtuve fueron errores COM incomprensibles (bienvenidos a WinRT, un enorme paso atrás tecnológico).

¿Cómo puedo (a) hacer que las vinculaciones funcionen correctamente (hay otras opciones de Binding que podría utilizar para forzarlas a que funcionen correctamente?), O (b) De lo contrario, permitir que elementos en mi ItemsContainer arbitrariamente en un Canvas basado en las conexiones de datos a las propiedades en los elementos de la colección?


Enlaces no son compatibles con Setters. Creo que Silverlight solo los obtuvo en la versión 5, si es que lo hizo. Para soluciones alternativas, puede ver mi artículo anterior here . Básicamente, usted define una propiedad de dependencia adjunta que configura el enlace para usted.


La aplicación de RenderTransform parece estar funcionando bien en Silverlight y Winrt / Metro / 8.1:

<ItemsControl ItemsSource="{Binding TreeMapItems}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas Background="White"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Brush}" ToolTipService.ToolTip="{Binding Label}"> <Rectangle.RenderTransform> <TranslateTransform X="{Binding X}" Y="{Binding Y}"/> </Rectangle.RenderTransform> </Rectangle> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>