Пользовательское свойство зависимости не работает - PullRequest
3 голосов
/ 07 мая 2011

У меня есть элемент управления панорамой, шаблон данных которого выглядит следующим образом: -

   <DataTemplate x:Key="DataTemplateCategory">
            <Grid >
                <localControls:PanoramaItem BookmarkedTopics="{Binding Path=BookmarkedTopics,ElementName=root}" Topics="{Binding Topics}"/>
            </Grid>
        </DataTemplate>

Корень - это имя пользовательского элемента управления, в котором определяется панорама. и BookmarkedTopics in Path - это DependencyProperty в корне (usercontrol), определение которого следующее: -

  public static readonly DependencyProperty BookmarkedTopicsProperty = DependencyProperty.Register("BookmarkedTopics",
           typeof(ObservableCollection<Topic>), typeof(MainPage), new PropertyMetadata(new ObservableCollection<Topic>()));
        public ObservableCollection<Topic> BookmarkedTopics
        {
            get { return GetValue(BookmarkedTopicsProperty) as ObservableCollection<Topic>; }
            set
            {

                SetValue(BookmarkedTopicsProperty, value);
            }
        }

BookmarkedTopics устанавливается в MainPage_Loaded, и это никогда не пустая или пустая коллекция (не имеет отношения к моему вопросу, но все же подумал упомянуть об этом). BookmarkedTopics - это свойство Dependency в PanoramaItem, определение которого: -

    public static readonly DependencyProperty BookmarkedTopicsProperty = DependencyProperty.Register("BookmarkedTopics",
       typeof(ObservableCollection<Topic>), typeof(PanoramaItem), new PropertyMetadata(new ObservableCollection<Topic>()));
    public ObservableCollection<Topic> BookmarkedTopics
    {
        get { return GetValue(BookmarkedTopicsProperty) as ObservableCollection<Topic>; }
        set
        {

            SetValue(BookmarkedTopicsProperty, value);
        }
    }

Проблема в том, что когда BookmarkedTopics устанавливаются в MainPage_Loaded, почему установщик BookmarkedTopics в PanoramaItem не запускается? Любая ошибка, которую вы можете увидеть в коде?

Заранее спасибо:)

Ответы [ 2 ]

9 голосов
/ 07 мая 2011

Когда значение свойства зависимости назначается привязкой или анимацией, Silverlight использует метод SetValue, непосредственно используя соответствующее статическое поле DependencyProperty. Следовательно, метод установки свойства POCO не вызывается.

Если вам нужен код для запуска при назначении свойства зависимости, вам нужно использовать код, подобный этому: -

    public ObservableCollection<Topic> BookmarkedTopics
    {
        get { return GetValue(BookmarkedTopicsProperty) as ObservableCollection<Topic>; }
        set { SetValue(BookmarkedTopicsProperty, value); }
    }

    public static readonly DependencyProperty BookmarkedTopicsProperty =
        DependencyProperty.Register(
            "BookmarkedTopics",
            typeof(ObservableCollection<Topic>),
            typeof(MainPage),
            new PropertyMetadata(null, OnBookmarkedTopicsPropertyChanged));

    private static void OnBookmarkedTopicsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MainPage source = d as MainPage;
        ObservableCollection<Topic> value = e.NewValue as ObservableCollection<Topic>;

        // Code here to handle any work when the value has changed
    }

Обратите внимание, что значением по умолчанию для этого свойства зависимости является null. Не используйте экземпляр изменяемого типа для свойства зависимости по умолчанию, поскольку этот экземпляр совместно используется всеми экземплярами вашего класса.

0 голосов
/ 07 мая 2011

Я знаю, что существуют проблемы с использованием типов ObservableCollection в свойствах зависимости, и я точно знаю, что вы не должны указывать ему значение по умолчанию для нового ObservableCollection.Вместо этого вы должны зарегистрировать его как ReadOnly (обратите внимание, что это не означает, что определение будет доступно только для чтения).

Этот пост MSDN описывает его более подробно.http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/e19f9f98-9007-4dbd-b1c4-664a511c0846/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...