Enlace de datos de comportamiento de Silverlight

estoy siguiendo este ejemplo de un comportamiento de desplazamiento automático en un ListBox en WP7 Mango RC apuntando a 7.1.

En mi Xaml:

 <ListBox x:Name="StatusMessages"
                 Height="100"
                 ItemsSource="{Binding StatusMessages, Mode=TwoWay}"
                 DisplayMemberPath="Message"
                 Grid.Row="3">
            <i:Interaction.Behaviors>
                <behaviors:ListBoxItemAutoScrollBehavior FoundItem="{Binding FoundItem}" />
            </i:Interaction.Behaviors>
        </ListBox>

El comportamiento:

 public class ListBoxItemAutoScrollBehavior : Behavior<ListBox>
    {       
        public object FoundItem
        {
            get { return GetValue(FoundItemProperty); }
            set { SetValue(FoundItemProperty, value); }
        }

        public static readonly DependencyProperty FoundItemProperty = DependencyProperty.Register("FoundItem", typeof (object), typeof (ListBoxItemAutoScrollBehavior), new PropertyMetadata(FoundItemChanged));

        private static void FoundItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((ListBoxItemAutoScrollBehavior) d).AssociatedObject.ScrollIntoView(e.NewValue);
        }
    }

Tengo un punto de interrupción establecido en el método FoundItemChanged y esperaría verlo cuando configuro FoundItem en mi ViewModel y disparo NotifyProperyChanged. Solo que no funciona, ¿alguna idea de por qué o qué podría estar haciendo mal?

Gracias.

actualización: se alcanzan puntos de interrupción para OnAttached y OnDetaching en el comportamiento.

actualización 2: Esto funciona en una aplicación Silveright 4 normal.

actualización 3: El uso de la versión 3.8.5.0 de System.Windows.Interactivity lo solucionó.

preguntado el 28 de agosto de 11 a las 05:08

2 Respuestas

¿Está apuntando a 7.1 / Mango? La vinculación a DependencyObjects, a diferencia de FrameworkElements, es una característica de Silverlight 4 y, por lo tanto, no está disponible en 7.0 (que usa SL 3).

Hay una solución que Prism y MVVM Light utilizan para unirse a DO en SL 3. Consulte su fuente para obtener más detalles.

Edit: Su problema son los argumentos del constructor PropertyMetadata. Al no especificar 2 argumentos (o, específicamente, pasar un método en lugar de una instancia de PropertyChangedCallback), el compilador podría estar resolviendo el valor por defecto sobrecarga del constructor.

En resumen, cámbielo a:

new PropertyMetadata(null, FoundItemChanged)

o:

new PropertyMetadata(new PropertyChangedCallback(FoundItemChanged)) 

Respondido 28 ago 11, 23:08

@Derek: creo que lo he sospechado, mira mi respuesta actualizada. - Richard Szalay

Gracias Richard pero todavía no funciona. No es fundamental para mí hacer que esto funcione, pero realmente me gustaría verlo funcionar por el bien de la cordura. - Derek Beattie

@Derek Si el primero o los dos fragmentos no funcionaron, me temo que no tengo sugerencias, aparte de crear un comportamiento más simple con un enlace funcional y trabajar al revés desde allí. - Richard Szalay

Sí, lo he hecho realmente simple ahora. Una nota, si configuro FoundItem = "test" en lugar de FoundItem = {Binding FoundItem, Mode = TwoWay}, se alcanza el punto de interrupción en el setter. Cuando está atado, no lo hace. - Derek Beattie

El uso de la versión 3.8.5.0 de System.Windows.Interactivity lo solucionó: | - Derek Beattie

El uso de la versión 3.8.5.0 de System.Windows.Interactivity solucionó este problema.

Esta publicación me dio el consejo: http://caliburnmicro.codeplex.com/discussions/271092

Respondido el 03 de Septiembre de 11 a las 04:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.