Привязка данных о поведении Silverlight

Я использую этот пример для поведение автоматической прокрутки в ListBox на WP7 Mango RC с таргетингом на 7.1.

В моем 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>

Поведение:

 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);
        }
    }

У меня есть точка останова, установленная в методе FoundItemChanged, и я ожидаю, что она сработает, когда я установлю FoundItem в своей ViewModel и запущу NotifyProperyChanged. Только это не работает, есть идеи, почему или что я могу делать неправильно?

Спасибо.

обновление: точки останова срабатывают для OnAttached и OnDetaching в поведении.

обновление 2: это работает в обычном приложении Silveright 4.

обновление 3: исправлено использование System.Windows.Interactivity версии 3.8.5.0.


person Derek Beattie    schedule 28.08.2011    source источник


Ответы (2)


Вы нацелены на 7.1 / Mango? Привязка к DependencyObjects, в отличие от FrameworkElements, является функцией Silverlight 4 и поэтому недоступна в версии 7.0 (которая использует SL 3).

Существует обходной путь, который Prism и MVVM Light используют для привязки к DO в SL 3. Подробности см. в их источнике.

Изменить. Ваша проблема заключается в аргументах конструктора PropertyMetadata. Не указывая 2 аргумента (или, в частности, передавая метод, а не экземпляр PropertyChangedCallback), компилятор может разрешать значение по умолчанию перегрузка конструктора.

Короче говоря, измените его на:

new PropertyMetadata(null, FoundItemChanged)

Or:

new PropertyMetadata(new PropertyChangedCallback(FoundItemChanged)) 
person Richard Szalay    schedule 28.08.2011
comment
@Derek - я думаю, что, возможно, догадался об этом, см. мой обновленный ответ. - person Richard Szalay; 28.08.2011
comment
Спасибо, Ричард, но это все еще не работает. Для меня не критично, чтобы это работало, но я бы очень хотел, чтобы это работало ради здравомыслия. - person Derek Beattie; 29.08.2011
comment
@Derek Если первый или два фрагмента не сработали, то, боюсь, у меня нет предложений, кроме создания более простого поведения с работающей привязкой и работы в обратном направлении. - person Richard Szalay; 30.08.2011
comment
Да, я сделал это очень просто сейчас. Одно примечание: если я устанавливаю FoundItem=test вместо FoundItem={Binding FoundItem, Mode=TwoWay}, точка останова в установщике срабатывает. Когда это связано, это не так. - person Derek Beattie; 30.08.2011
comment
@Derek - Возможно, не связанная с этим заметка, я бы рекомендовал удалить Mode=TwoWay из обеих привязок выше. В лучшем случае это мертвый код, который можно удалить; в худшем случае это может повлиять на ошибку, которую вы видите. - person Richard Szalay; 30.08.2011
comment
Да, TwoWay не понадобился бы, я убрал его из кода выше, но пробовал несколькими способами. Возможно, это баг с манго, так как он отлично работает в SL4. Проголосовал за ваш ответ, спасибо за помощь. - person Derek Beattie; 30.08.2011
comment
Использование версии 3.8.5.0 System.Windows.Interactivity исправило это: | - person Derek Beattie; 02.09.2011
comment
@Derek - Вы должны опубликовать это как собственный ответ. - person Richard Szalay; 02.09.2011

Использование System.Windows.Interactivity версии 3.8.5.0 устранило эту проблему.

Этот пост дал мне совет: http://caliburnmicro.codeplex.com/discussions/271092

person Derek Beattie    schedule 03.09.2011