2010-10-21 96 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

相關問題