Свойство зависимости Silverlight не обновляется / не изменяется - PullRequest
2 голосов
/ 21 октября 2010

У меня проблемы с обновлением свойства зависимостей в Silverlight. Я устанавливаю свойство и уведомляю об его изменении в родительском классе. Пользовательский элемент управления прослушивает изменение этого свойства через свойство зависимостей, но никогда не обращается к нему (вызывает обратный вызов изменения). Я играл с этим, и единственный раз, когда я могу заставить его ударить, это если я установлю значение по умолчанию, но оно никогда не приобретет новое значение. Я устанавливаю точки останова и вижу изменение значений, и даже помещаю текстовый блок с объектом NotificationModel.Type, и он меняется отлично. Пожалуйста, помогите!

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 Ответ

1 голос
/ 21 октября 2010

Я не вижу ничего плохого в коде, который вы опубликовали до сих пор. Существует предположение, что OnPropertyChanged запускает событие PropertyChanged INotifyPropertyChanged, реализованное содержащим классом.

Мое внимание было бы на самом Binding. Обычно они молча терпят неудачу, если путь к свойствам не разрешим, как правило, ничего не происходит.

Вы уверены, что вам нужно ссылаться на LayoutRoot по имени? Не находится ли элемент управления внутри LayoutRoot без других элементов управления-предков, у которых их DataContext отклонен в другом месте? Почему необходимо двухстороннее связывание, которое кажется очень странным? Попробуйте просто: -

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