【问题标题】:Silverlight Depedency Property Not Updating/ChangingSilverlight 依赖属性未更新/更改
【发布时间】:2010-10-21 05:49:59
【问题描述】:

我在 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;
                }
            }
        }
    }
}

【问题讨论】:

    标签: silverlight dependency-properties


    【解决方案1】:

    到目前为止,您发布的代码没有任何问题。假设OnPropertyChanged 正在触发由包含类实现的INotifyPropertyChangedPropertyChanged 事件。

    我的注意力将集中在Binding 本身。这些通常会默默地失败,如果属性路径不可解析,通常什么都不会发生。

    您确定需要按名称引用LayoutRoot 吗?如果没有其他祖先控件将其DataContext 转移到其他地方,控件是否还没有位于LayoutRoot 中?为什么需要双向绑定,这似乎很奇怪?尝试简单:-

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

    【讨论】:

    • 相信我,我也这样做了,只是留下了我尝试使用的代码,而不是您刚才提到的代码,但工作方式相同。是的,它一定是默默地失败了,我只是无法指出如何或在哪里。
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多