español - wpf binding types
La vinculación en el estilo de WPF provoca un error inexplicable "No se puede encontrar FrameworkEnlace" (3)
Tengo un ItemsControl
que muestra un montón de rectángulos. Cada rectángulo debe estar desplazado hacia arriba y hacia la izquierda. Entonces, creé un RectangleStyle
que usa enlaces para establecer el ancho, alto, X traducción y Y traducción para un rectángulo.
Los enlaces de ancho y alto funcionan bien, pero obtengo el siguiente error para los enlaces de TranslateTransform
:
Error de System.Windows.Data: 2: no se puede encontrar FrameworkElemento o FrameworkContentElement para el elemento de destino. BindingExpression: Path = Offset.X; DataItem = null; el elemento de destino es ''TranslateTransform'' (HashCode = 16452547); la propiedad de destino es ''X'' (tipo ''Doble'')
Aquí está la definición de mi ItemControl
:
<ItemsControl
Style="{StaticResource ItemsControlStyle}"
ItemsSource="{Binding Zones}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Style="{StaticResource RectangleStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Aquí está la definición de ItemsControlStyle
:
<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Point.X}" />
<Setter Property="Canvas.Top" Value="{Binding Point.Y}" />
</Style>
</Setter.Value>
</Setter>
</Style>
Y aquí está la definición de RectangleStyle
:
<Style x:Key="RectangleStyle" TargetType="Rectangle">
<Setter Property="Width" Value="{Binding Size.Width}" />
<Setter Property="Height" Value="{Binding Size.Height}" />
<Setter Property="RenderTransform">
<Setter.Value>
<!-- these bindings are causing the error -->
<TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
</Setter.Value>
</Setter>
</Style>
Los dos enlaces en el setter RenderTransform
de RectangleStyle
son la causa del error, pero no estoy seguro de qué hacer para solucionar el problema. Curiosamente, los gráficos se están traduciendo correctamente, por lo que WPF puede resolver los enlaces; por alguna razón, no está contento con ellos.
¿Qué puedo hacer para arreglar los enlaces?
Editar
Envié un informe de error en MS Connect:
Creo que encontré información útil.
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683
La respuesta a esto parece estar en la explicación de Microsoft del comportamiento, ya que ItemsControl pasa por su proceso de composición y aplica enlaces y estilos. Es decir, WPF está tratando de optimizar su DataTemplate antes de que tenga una fuente de datos para evaluar con éxito los enlaces: "dataitem = null". En cualquier otra instancia durante sus pases de disposición, "dataitem" apunta a algo en su "Iones" IEnumerable y puede completar los enlaces. De lo contrario, verás el error con cada elemento de tu colección, en lugar de solo una vez por propiedad.
Parece ser un tipo de "no prestar atención al hombre detrás de la cortina". Y probablemente debería agregarse a MS Connect como un informe de error; El código exitoso no debe expulsar a los "errores" que no importan. Pero le dejaré que presente esto con MS Connect si lo desea.
Después de leer la respuesta de Rob Perkins, agregué un FallbackValue a un enlace con este problema. Esto borró el error para mí.
Tampoco puedo explicar por qué ocurre el mensaje de error, pero descubrí que agregar una propiedad x: Name a la transformación es una forma de deshacerse del mensaje de error:
<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" />