Silverlight行为数据绑定

时间:2011-08-28 05:13:14

标签: windows-phone-7 silverlight-4.0 mvvm caliburn.micro

我正在关注针对7.1的WP7 Mango RC上的ListBox上的自动滚动行为的this示例。

在我的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方法中设置了一个断点,当我在ViewModel中设置FoundItem并激活NotifyProperyChanged时,它会看到它被击中。只是,它不起作用,任何想法为什么或我可能做错了什么?

感谢。

更新:行为中的OnAttached和OnDetaching会遇到断点。

更新 2:这适用于常规的Silveright 4应用程序。

更新 3:使用System.Windows.Interactivity版本3.8.5.0修复它。

2 个答案:

答案 0 :(得分:2)

你的目标是7.1 /芒果吗?绑定到DependencyObjects,而不是FrameworkElements,是一个Silverlight 4功能,因此在7.0(使用SL 3)中不可用。

有一种解决方法,Prism和MVVM Light用于绑定到SL中的DO 3.查看其来源以获取详细信息。

编辑:您的问题是您的PropertyMetadata构造函数参数。通过不指定2个参数(或者,具体而言,传递方法而不是PropertyChangedCallback实例),编译器可能正在解析default value构造函数重载。

简而言之,请将其更改为:

new PropertyMetadata(null, FoundItemChanged)

或者:

new PropertyMetadata(new PropertyChangedCallback(FoundItemChanged)) 

答案 1 :(得分:0)

使用System.Windows.Interactivity版本3.8.5.0解决了这个问题。

这篇帖子给了我一个提示:http://caliburnmicro.codeplex.com/discussions/271092