2010-10-21 63 views
2

我在更新Silverlight的依赖项属性时遇到问题。我正在设置一个属性并通知它在我的父类中已更改。自定义控件通过依赖属性侦听此属性的更改,但它从不打它(调用更改回调)。我一直在玩这个游戏,唯一一次能够击中它的是如果我设置了一个默认值,但它永远不会达到新的值。我正在设置断点并查看这些值的变化,甚至将一个带有NotificationModel.Type对象的文本块放入它中,并且它正常更改。请帮忙!Silverlight的依赖属性没有更新/更改

Main.xaml

<views:NotificationView x:Name="NotificationView" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Notification="{Binding Path=DataContext.Notification, ElementName=LayoutRoot, Mode=TwoWay}"></views:NotificationView> 

MainViewModel.cs

void part_NotificationChanged(object sender, NotificationChangedEventArgs e) 
    { 
     Notification = new NotificationModel() 
     { 
      Notifications = e.Notification.Notifications, 
      Type = e.Notification.Type 
     }; 
    } 

    private NotificationModel _notification; 
    public NotificationModel Notification 
    { 
     get 
     { 
      return _notification; 
     } 
     set 
     { 
      _notification = value; 
      this.OnPropertyChanged("Notification"); 
     } 
    } 

NotificationView.xaml.cs

public partial class NotificationView : UserControl 
{ 
    public NotificationView() 
    { 
     InitializeComponent(); 


    } 

    public NotificationModel Notification 
    { 
     get 
     { 
      return (NotificationModel)GetValue(NotificationProperty); 
     } 
     set 
     { 
      SetValue(NotificationProperty, value); 
     } 
    } 

    public static readonly DependencyProperty NotificationProperty = 
     DependencyProperty.Register("Notification", typeof(NotificationModel), typeof(NotificationView), new PropertyMetadata(new PropertyChangedCallback(OnNotificationChanged))); 


    private static void OnNotificationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     NotificationView view = d as NotificationView; 

     if (view != null) 
     { 
      NotificationModel notification = e.NewValue as NotificationModel; 

      if (notification != null) 
      { 
       switch (notification.Type) 
       { 
        case NotificationType.Success: 
         view.LayoutRoot.Children.Add(new SuccessView() { Message = notification.Notifications.FirstOrDefault() }); 
         break; 
        case NotificationType.Error: 
         view.LayoutRoot.Children.Add(new ErrorsView() { Errors = notification.Notifications }); 
         break; 
        case NotificationType.Caution: 
         break; 
        default: 
         view.LayoutRoot.Children.Clear(); 
         break; 
       } 
      } 
     } 
    } 
} 

回答

1

我能看到什么不对您到目前为止发布的代码。假设OnPropertyChanged正在触发由包含类实现的PropertyChanged事件INotifyPropertyChanged

我的注意力将在Binding本身。这些通常会失败,如果属性路径无法解析通常不会发生。

您确定您需要引用LayoutRoot的名称吗?如果没有其他祖先控制器,LayoutRoot控制器不在转向其他地方吗?为什么需要双向绑定,这似乎很奇怪?试试看:

<views:NotificationView x:Name="NotificationView" Notification="{Binding Notification}" ... /> 
+0

相信我我也这样做了,它只是留下了代码,我尝试使用,而不是刚才提到的代码,但它的工作原理虽然如此。是的,它必须以某种方式默默地失败,我不能指出如何或在哪里。 – 2010-10-21 21:56:09