Использование свойств зависимостей в wpf - PullRequest
1 голос
/ 19 апреля 2010

Я не совсем уверен, правильно ли я понял это или нет, то, что я прочитал, похоже, согласуется с тем, что я пытаюсь сделать, однако, похоже, это не работает.

Если я добавлю дополнительного владельца к свойству зависимостей класса, всякий раз, когда изменяется класс orig dp, изменение должно передаваться дополнительному владельцу, правильно?

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

public class Class1: DependencyObject{
  public static readonly DependencyProperty LongDayHeadersProperty;

  public bool LongDayHeaders {
     get { return (bool)GetValue(LongDayHeadersProperty); }
     set { SetValue(LongDayHeadersProperty, value); }
  }

  static Class1(){
    LongDayHeadersProperty = DependencyProperty.Register("LongDayHeaders", typeof(bool), typeof(Class1),
            new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));
  }
}

public class Class2: DependecyObject{
  public static readonly DependencyProperty LongDayHeadersProperty;

  public bool LongDayHeaders{
    get{ return(bool)GetValue(LongDayHeadersProperty); }
    set{ SetValue(LongDayHeadersProperty, value); }
  }

  static Class2(){
    LongDayHeadersProperty = Class1.LongDayHeadersProperty.AddOwner(typeof(Class2));
  }
}

Но если я назначу DependencyPropertyDescriptor для обоих свойств, он срабатывает только для Class1, а Class2 не изменяется.

Я что-то упустил в моем понимании?

UPDATE

После некоторого тестирования я даже не уверен, считается ли мой дочерний элемент управления дочерним элементом в логическом или визуальном дереве. Я думаю, что это так, но отсутствие успеха заставляет меня верить в обратное.

Существует множество class2, которые существуют в наблюдаемой коллекции class1. Для меня это делает их детьми класса 1? Но даже если я использую RegisterAttach на class2, и устанавливаю свойство в class1, это, кажется, не имеет никакого эффекта?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2010

Вы путаете свойства DependencyProperties со свойствами Attached (Dependency).

DP - это когда классу нужны свойства привязки, стили и т.д. Как и свойства .NET, они находятся в своих классах. Вы можете зарегистрироваться для события измененного свойства на отдельных объектах, но не глобально. TextBox.Text является примером этого. Обратите внимание, что Label.Text не имеет отношения к TextBox.Text.

Точка доступа предназначена для того, когда класс хочет украсить другой объект с дополнительными свойствами. Класс, который объявляет AP, может прослушивать события изменения свойств во ВСЕХ экземплярах других объектов, для которых установлен этот AP. Canvas.Left является примером этого. Обратите внимание, что вы всегда должны квалифицировать этот сеттер: <Label Text="Hi" Canvas.Left="50"/>

0 голосов
/ 20 апреля 2010

Как указано MSDN , флаг Inherits работает только при использовании RegisterAttached для создания свойства. Вы все еще можете использовать синтаксис свойства для свойства.

Обновление

Для ясности, вот как я бы определил свойства:

public class Class1 : FrameworkElement
{
    public static readonly DependencyProperty LongDayHeadersProperty = 
        DependencyProperty.RegisterAttached("LongDayHeaders", 
        typeof(bool),
        typeof(Class1),
        new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));

    public bool LongDayHeaders 
    {
        get { return (bool)GetValue(LongDayHeadersProperty); }
        set { SetValue(LongDayHeadersProperty, value); }
    }
}

public class Class2: FrameworkElement
{
    public static readonly DependencyProperty LongDayHeadersProperty = 
        Class1.LongDayHeadersProperty.AddOwner(typeof(Class2));

    public bool LongDayHeaders
    {
        get{ return(bool)GetValue(LongDayHeadersProperty); }
        set{ SetValue(LongDayHeadersProperty, value); }
    }
}

Если вы хотите, чтобы ваши дети были логическими детьми вашего контроля, вам нужно позвонить по номеру AddLogicalChild. Кроме того, вы должны выставить их через свойство LogicalChildren. Я также должен указать, что оба класса должны быть производными от FrameworkElement или FrameworkContentElement, поскольку логическое дерево определено только для этих элементов.

Поскольку вы используете ObservableCollection, вы будете обрабатывать события, измененные в коллекции, и добавлять / удалять дочерние элементы в зависимости от изменения. Кроме того, свойство LogicalChildren может просто возвращать перечислитель вашей коллекции.

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